C + +: 쌓 아 올 리 는 대상 을 만 드 시 겠 습 니까? 스 택 에 만 드 시 겠 습 니까?

4466 단어 C++
다음으로 이동:http://www.devbean.net/2014/02/cpp-create-object-on-heap-or-stack/
 
더미 에 대상 을 만 들 려 면 new 연산 자 를 사용 하거나 malloc 시리즈 함 수 를 사용 하 십시오.이의 없습니다.
정말 이의 가 있 는 것 은 다음 코드 입 니 다.
 
 
 
 
 
 
C++
 
1
Object
obj
;
 
이때 obj 는 창고 에서 분배 한 것 입 니까?
이 문제 에 대답 하려 면, 우 리 는 먼저 이 문구 가 무슨 뜻 인지 이해 해 야 한다.이 문 구 는 스 택 에 대상 을 만 드 는 것 을 의미 하 는 것 입 니까?
사실 이 줄 의 의 미 는 대상 obj 을 '자동 저장 (automatic storage)' 의 성질 을 가지 게 하 는 것 이다.'자동 저장' 이란 이 대상 의 저장 위 치 는 성명 이 있 는 문맥 에 달 려 있다 는 뜻 이다.
이 문 구 는 함수 내부 에 나타 나 면 스 택 에 대상 을 만 듭 니 다.
만약 에 이 문장 이 함수 내부 가 아니 라 하나의 구성원 변수 로 서 이 유형의 대상 이 어떻게 분배 되 는 지 에 달 려 있다.다음 코드 를 고려 하 십시오:
 
 
 
 
 
 
C++
 
1
2
3
4
5
6
class
Class
{
    
Object
obj
;
}
;
 
Class
pClass
=
new
Class
;
 
포인터 pClass 가 가리 키 는 대상 이 쌓 여 공간 을 분배 합 니 다.Object obj; 문장의 의 미 는 '자동 저장' 이기 때문에 pClass->obj 도 쌓 아 올 린 것 이다.
이 점 을 이해 하고 다음 문장 을 살 펴 보 자.
 
 
 
 
 
 
C++
 
1
2
Object
*
pObj
;
pObj
=
new
Object
;
  Object *pObj; 대표 적 으로 포인터 pObj 는 자동 으로 저장 되 는데 이것 뿐 다른 의미 가 없다.다음 줄 의 문 구 는 이 지침 이 가리 키 는 대상 이 더미 위 에서 분 배 된 것 이 라 고 지적 했다.만약 이 두 줄 의 문장 이 한 함수 내부 에 나타난다 면 함수 가 끝 날 때 pObj 는 소각 되 지만, 그것 이 가리 키 는 대상 은 그렇지 않다 는 것 을 의미한다.따라서 이 대상 을 계속 사용 하기 위해 서 우 리 는 함수 마지막 에 return 문 구 를 추가 하거나 전달 파 라 메 터 를 사용 합 니 다.그렇지 않 으 면 쌓 아 올 린 대상 이 포인터 가 가리 키 지 않 는 다. 즉, 이 대상 이 메모리 유출 을 일 으 켰 다 는 것 이다.
포인터 가 가리 키 는 대상 이 모두 쌓 여 만 든 것 은 아니다.다음 코드 는 스 택 에 만 든 대상 을 포인터 로 가리 킵 니 다.
 
 
 
 
 
C++
 
1
2
Object
obj
;
Object
*
pObj
=
&obj
;
 
이로써 우 리 는 함수 내부 의 변수 와 구성원 변 수 를 설명 했다.그리고 두 가지 변수 가 있 습 니 다. 전역 변수 와 static 변수 입 니 다.그것들 은 쌓 아 올 리 지 않 고 창고 에서 만 들 지 않 는 다.그것들 은 쌓 기와 창 고 를 제외 한 데이터 구역 으로 자신의 메모리 공간 을 가지 고 있다.즉, Object obj 즉 함수 내부 에 있 지 않 고 클래스 의 구성원 변수 도 아 닐 때 이 대상 은 전체 데이터 세그먼트 에서 생 성 되 고 같은 이치 로 static 변수 에 적용 된다.포인터 Object *pObj; 에 대해 이 문구 가 함수 내부 나 클래스 의 구성원 변수 에 나타 나 면 앞에서 말 한 것 처럼 이 지침 은 자동 으로 저 장 됩 니 다.그러나 이 문 구 는 클래스 의 외부 에 있다 면 전체 데이터 세그먼트 에서 만 든 것 입 니 다.대상 이 쌓 여 있 을 수도 있 고 스 택 에 만 들 수도 있 습 니 다.
쌓 기와 창고 의 차 이 는 두 가지 에 있다.
생명주기 성능 첫 번 째 가 우리 가 중점적으로 고려 해 야 할 것 이다.스 택 의 특성 상 컨 텍스트 보다 더 긴 수명 주 기 를 가 진 변수 가 필요 하 다 면 쌓 아 올 릴 수 밖 에 없습니다.그래서 우리 의 추천 은 스 택 에 대상 을 만 들 수 있다 면 스 택 에서 만 드 는 것 입 니 다.그렇지 않 으 면 더 긴 생명 주기 가 필요 하 다 면 쌓 아 올 리 는 것 을 선택 할 수 밖 에 없다.이것 은 창고 에 있 는 대상 이 우리 가 수 동 으로 메모 리 를 관리 할 필요 가 없 기 때문이다.경험 이 있 는 개발 자 들 은 메모리 관리 에 골 머리 를 앓 는 다. 우 리 는 이런 상황 을 피해 야 한다.전체적으로 말 하면, 우 리 는 창고 에 대상 을 만 드 는 것 을 더 추천 합 니 다.
그러나 스 택 에 대상 을 만 들 더 라 도 쌓 인 공간 을 차지 하 는 경우 도 있다.다음 코드 를 고려 합 니 다:
 
 
 
 
 
 
C++
 
1
2
3
4
void
func
{
    
std
::
vector
v
;
}
 
대상 v 은 스 택 에서 만 들 어 졌 습 니 다.그러나 STL 의 vector 류 는 사실은 더미 위 에 데 이 터 를 저장 하 는 것 이다 (이 점 은 소스 코드 를 볼 수 있다).따라서 대상 v 자체 가 스 택 에 있 고 관리 하 는 데이터 (이런 데 이 터 는 대부분 그 자체 의 크기 보다 훨씬 클 때) 만 쌓 여 있 습 니까? 아니면 쌓 여 있 습 니까?
두 번 째 성능 에 대해 서 는 영향 이 있 지만, 일반적으로 무시 할 수 있다.정확히 말 하면, 일반적으로 그것 이 정말 문제 가 되 지 않 는 한 성능 문 제 를 고려 할 필요 가 없다.
우선, 더미 위 에 대상 을 만 들 려 면 메모리 의 사용 가능 한 영역 을 추적 해 야 합 니 다.이 알고리즘 은 운영 체제 에서 제공 하 는 것 으로 보통 상수 시간 이 아 닙 니 다.메모리 에 대량의 파편 이 나타 나 거나 거의 100% 메모리 가 사용 되 었 을 때 이 과정 은 더욱 오래 될 것 이다.이에 비해 스 택 분 배 는 상수 시간 이다.그 다음으로 창고 의 크기 는 고정 되 어 있 고 무더기 의 크기 보다 훨씬 작다.따라서 큰 상 대 를 분배 하거나 작은 상 대 를 많이 분배 해 야 한다 면 일반적으로 쌓 는 것 이 더 좋 은 선택 이다.만약 당신 이 분배 한 대상 의 크기 가 창고 의 크기 를 초과 한다 면, 보통 이상 을 던 질 것 입 니 다.비록 매우 드 물 지만, 때로는 확실히 발생 한다.성능 에 관 한 문 제 는 내장 형 개발 에 더 많이 나타난다. 메모리 의 빈번 한 분배, 방출 은 파편 문 제 를 일 으 킬 수 있다.
현대 운영 체제 에 서 는 더미 와 스 택 이 가상 메모리 에 반영 된다.32 비트 Linux 에 서 는 2G 의 데 이 터 를 더미 에 넣 을 수 있 으 며, Mac OS 에 서 는 스 택 이 65M 으로 제 한 될 수 있 습 니 다.
전체적으로 말 하면 쌓 여 있 는 지, 아니면 창고 에 대상 을 만 드 는 지 에 대해 서 는 당신 이 필요 로 하 는 생명 주 기 를 먼저 고려 해 야 합 니 다.성능 이 진정 으로 병목 이 될 때 만 성능 문 제 를 고려한다.더미 와 스 택 은 개발 자 에 게 제공 하 는 두 가지 서로 다른 도구 입 니 다. 모든 것 이 정확 한 규칙 이 존재 하지 않 습 니 다. 한 대상 이 쌓 여 있어 야 하 는 지, 아니면 스 택 에 있어 야 하 는 지 알려 드 립 니 다.선택권 은 개발 자 에 게 있 고 결정 권 은 개발 자의 경험 에 있 습 니 다.

좋은 웹페이지 즐겨찾기