2012-06-05 3 views
3

대답은 간단해야하지만 확실히하고 싶었습니다.sizeof()가 재귀 적입니까?

sizeof()은 재귀입니까? 예를 들어,

struct foo 
{ 
    DWORD a; 
    DWORD b; 
}; 

struct bar 
{ 
    DWORD c; 
    foo d; 
}; 

sizeof(bar) 전체 12 바이트를 반환 foo의 크기를 포함 할 것입니다 (DWORD는 4 바이트 가정)?

+8

않을 것, 자신이 밖으로 시도하는 것은 매우 간단했을 것이다? –

+1

실제로; 그러나 나는 google이 여분의, 그리고, 또는,하지만 (즉, '특정 컴파일러는 x'등을)주지 않았고 앞으로 답을하지 않았기 때문에 공개적으로 가지고있는 좋은 q/a라고 생각했다. 누군가가 빠른 답변을 원할 경우 사용할 수 있습니다. 이 문제를 몇 초 만에 테스트 할 수 있었다는 것을 알고 있습니다.) – Qix

+1

@ SimonAndréForsberg : 아니요. 컴파일러에서 12 바이트로 만들었습니다. 그러나 컴파일러가 패딩을 삽입 할 수 있기 때문에 그 대답은 일반화 될 수 없습니다. – MSalters

답변

5

예 ... sizeof 가상 기지, 가상 파견 테이블 포인터를 추적 struct/class 데이터 멤버, 가상이 아닌 기본 클래스, 일부 구현 정의 링크/카운터를 포함하여 직접 유형에 포함 된 모든 구성원의 총을 제공합니다 , 패딩을 사용하면 데이터 멤버를 CPU 안전 또는 효율적인 액세스를 위해 정렬 할 수 있습니다. 이론적으로 구현이 거기에 넣는 것처럼 느껴질 수도 있습니다. (예 : 런타임 디버깅/오류 감지, 가비지 콜렉션에 대한 비표준 지원 ...)

물론 가리키는 대상 또는 참조 된 개체의 크기는 포함되지 않지만 포인터와 참조의 크기

+0

+1은 "이론적으로 구현은 거기에 넣는 것처럼 느껴질 수 있습니다!"* – Nawaz

6

예, sizeof 연산자는 모든 멤버를 포함하여 구조체 크기를 제공합니다.

그러나 컴파일러는 자체 패딩을 추가 할 수 있으므로 실제 크기 이 구조체 멤버 크기의 합과 같을 수도 있고 그렇지 않을 수도 있습니다.

3

예, 그렇습니다. TC3 : ISO/IEC 9899에서 발췌

구조 또는 조합 형태를 갖는 오퍼랜드에인가

결과는 내부 및 후행 패딩을 포함한 이러한 객체 바이트의 총 수이다.

(강조 광산)