2013-08-13 3 views
4

나는 std::vector을 사용하는 것에 대해 의문을 가지고 있습니다. std::vector 개체가 메모리에 정의되지 않은 공간이있는 경우 다시 할당해야하는 경우 (std::vector) 구조도 다시 할당됩니까? 또는 std::vector 만? 예를 들어구조 내의 C++ 벡터

:

struct cluster{ 
    int a; 
    int b; 
    struct cluster* parent; 
    vector<struct cluster> children; 
} 

struct cluster obj = {2,1,...}; 

struct cluster *pobj = &obj; 

for(int i = 0; i < 100 ; i ++){ 
    children.push_back(i); //The capacity will be increased progressly, no? 
} 

그래서, 질문은 : for 루프의 끝에서 pobj==&obj입니까? 또는 자식 std::vector의 재 할당 때문에 obj이 재 할당 되었습니까?

나는 의심의 여지가 있었으면 좋겠습니다. 시간 내 주셔서 감사합니다.

+0

가능한 복제본 : http://stackoverflow.com/questions/17528855/why-constant-size-of-struct-despite-having-a-vector-of-int – hmjd

+3

질문은 확실하지 않습니다. 이것은 정의되지 않은 동작입니다. 불완전한 타입으로'std :: vector' 인스턴스를 생성 할 수 없습니다.'cluster'는'childs'가 선언 된 지점에 있습니다. – juanchopanza

+0

아, 나는 당신이 무엇을 말하려고하는지 이해할 수 없다. 이 구조를 사용하여 색상 추적 알고리즘을 위해 분할 된 이미지를 살펴 봅니다. 이미지가 분할되면 RLE로 성문화됩니다. 마침내 나는 RLE에 성문화 된 픽셀의 일부 클러스터를 "부모가 될"필요가 있습니다. 처음에는 모든 구조에 대해 고유 한 부모와 자식을 사용했지만 중복 된 클러스터에 문제가 있다는 것을 깨달았습니다. – Bardo91

답변

7

아니요, obj 변수는 내부 멤버가 변경되므로 절대로 다시 할당되지 않습니다. 벡터는 데이터에 대한 자체 포인터를 가지며 내부적으로 모든 자체 할당 및 재 할당을 처리합니다.

이런 식으로 생각하십시오. 일반적으로 로컬 변수 (전체 구조 및 배열 포함)는 현재 함수의 스택에 배치됩니다. 컴파일러는 기본 주소의 오프셋을 통해 이러한 변수에 액세스합니다. 컴파일러 (또는 시스템)가 갑자기 메모리에서 변수를 이동하기 시작하면 가변 액세스 이 상당히으로 복잡해지고 프로그램의 런타임 속도와 효율성에 상당한 영향을 미칩니다. 따라서 지역 변수는 스택에 있고 컴파일러가 어디에 두 었는지 남아 있습니다. 힙에 할당 된 데이터 (예 : std::vector 내부의 데이터)는 데이터에 대한 포인터에서 업데이트해야하는 모든 항목에서 쉽게 이동할 수 있으므로 벡터 객체에서 내부적으로 처리되기 전에 말했듯이 아무 것도 알 수 없습니다 어쨌든.

+3

당신의 설명이 좋은 한 멀리가는 동안, 당신은 정말로 서면으로, 그의 코드는 정의되지 않은 행동을 지적해야합니다. (보통'-D_GLIBCXX_CONCEPT_CHECKS'를 사용하면 g ++로 컴파일되지 않습니다.) –