2013-10-09 4 views
1

다음에 대해 56 바이트를 얻고 있습니다. 아무도 그 방법을 설명 할 수 있습니까?sizeof 구조체는 어떻게 발견됩니까?

#include <stdio.h> 

typedef struct how_many_bytes { 
    long s[4]; 
    char c, e; 
    int i[2]; 
    char *d;  
} How_Many_Bytes; 

int main(){  
    printf("%lu ", sizeof(How_Many_Bytes)); 
} 

그것은 있어야하지 (4 * 8) + 1 + 1 + 2 (패딩) + 4 + 4 + 8 = 52 바이트

답변

0

char *d 회원 앞에 추가로 4 바이트의 패딩이 있다는 점만 제외하면 분석 내용이 정확합니다. 이것은 d 구성원이 8 바이트 경계에 정렬되도록하기위한 것입니다.

- 64에이 구조체의 pahole 출력이 없습니다 :

struct how_many_bytes { 
     long int     s[4];     /*  0 32 */ 
     char      c;     /* 32  1 */ 
     char      e;     /* 33  1 */ 

     /* XXX 2 bytes hole, try to pack */ 

     int      i[2];     /* 36  8 */ 

     /* XXX 4 bytes hole, try to pack */ 

     char *      d;     /* 48  8 */ 

     /* size: 56, cachelines: 1 */ 
     /* sum members: 50, holes: 2, sum holes: 6 */ 
     /* last cacheline: 56 bytes */ 
};  /* definitions: 1 */ 

아무리 당신이이 구조체의 멤버를 다시 정렬하는 방법, 당신은 패딩의 총에보다 나은 6 바이트를 할 수 없습니다 . 멤버 크기의 합은 50 바이트이고 구조체 멤버의 최대 정렬은 8이므로 멤버를 최적의 순서로 배열하더라도 구조체의 끝에 6 바이트의 패딩이 있습니다. 크기를 8의 다음 큰 배수로 맞 춥니 다.

+0

매우 이해하기 쉽습니다. 고마워. :) – ivesingh

3

는 64 비트 시스템이기 때문에, 그래서 귀하의 계산에서 2 대신 패딩은 6입니다.

또한 %zu을 사용하여 size_t을 인쇄해야합니다.

+0

크기가 34 바이트이므로 int에 도달하면 40에서 시작하여 2 int 뒤에 오는 6 패딩이 될 것이라고 말하고 있습니까? 그것이 32 비트 머신이라면 int가 36에서 시작하겠습니까? – ivesingh

+0

@ user2844889 바로. –

+0

4 바이트 int는 8 바이트 경계로 패딩 될 필요가 없습니다. 여기에 2 바이트가 맞습니다. 추가 4 바이트의 패딩은 8 바이트 포인터 개체 앞에 있습니다. – caf