2014-03-27 1 views
2

sizeof가 구성원 초기화 프로그램에서 사용되는 동작은 무엇입니까? 정확히 그 부분에 대한 설명을 찾을 수 없습니다. 아래 코드 예제에서는 안전합니까? 즉,의 멤버가 A의 오른쪽 크기를 넣은 컴파일러가 b에 있습니까?sizeof가 member initializer에서 사용하는 동작은 무엇입니까?

struct A 
{ 
    int a = 0; 
    int b = sizeof(A); 
    int c = 3; 
    int d = 4; 
    char s[256]; 

    A() 
    { 
     //printf("b = %d\n", b); 
    } 
}; 
+1

올바르게 작동해야합니다. 구조체 선언은 이니셜 라이저에 종속적이지 않으므로 sizeof는 구조체 작성 중에 채워져 구조체의 크기를 알 수 있습니다. –

+0

좀 더 흥미로운 것을 시도해야합니다. 지도 등을 추가하십시오. –

+2

"지도에 추가"는 어떤 차이가 있습니까? 'std :: map'은'sizeof'에 대해서 고정 된 크기를 가지고 있습니다. 그런 다음 동적 크기가 달라질 수 있지만 이는 완전히 무의미합니다. 컴파일러가'class' 또는'struct'의 정의를 아는 한, 정상적으로 작동합니다. 다른 유형에는 알 수없는 크기의 요소를 사용할 수 없습니다. 이것이 완전히 정의되지 않은 객체에 대한 포인터 또는 참조를 사용해야하는 이유입니다. –

답변

5

struct의 크기는 struct 내부의 설정 값보다 훨씬 이전에 컴파일 결정된다.

+0

정적 요소가 아닌 멤버의 이니셜 라이저가 실제로 생성자의 정의와 동일한 범위를 가지기 때문입니다. 만약 코드가'struct A {static constexpr int i = sizeof (A); }; '이니셜 라이저가 다른 범위에 있고 형식이 불완전하기 때문에 작동하지 않습니다. – bames53