크기

2009-12-03 6 views
35

가능한 중복 :크기

#include <stdio.h>  

struct employee 
{ 
    int id; 
    char name[30]; 
}; 

int main() 
{ 
    struct employee e1;  
    printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1)); 
    return(0); 
} 

출력은 :

4 30 36


Why isn’t sizeof for a struct equal to the sum of sizeof of each member?

다음 C 코드를 고려

구조체의 크기가 개별 구성 요소 변수의 크기 합계와 같지 않은 이유는 무엇입니까?

+1

당신은 GCC에 포장 속성을 사용할 수 있습니다 ...이 패딩을 드롭하고 가능한 한 작게 구조를 유지한다. struct test_t { int c; } __attribute __ ((__ packed__))); – eaanon01

+0

중복 된 (적어도) http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member – dmckee

+6

eaanon01 . 정말로 정말로 좋은 이유가 있고 모든 함의가 이해되지 않는 한 당신은 포장 된 속성처럼 무언가에 관해서 아무에게도 말하면 안됩니다. –

답변

52

컴파일러는 정렬 요구 사항에 패딩을 추가 할 수 있습니다. 이것은 struct의 필드 사이에 패딩하는 것뿐만 아니라 구조체의 끝에 적용 할 수도 있습니다 (따라서 구조체 유형의 배열은 각 요소가 올바르게 정렬됩니다). 예를 들어

:

struct foo_t { 
    int x; 
    char c; 
}; 

c 필드 패딩을 필요로하지 않는다하더라도, 구조체는 일반적으로 sizeof(struct foo_t) == 8 (32 비트 시스템에있을 것이다 - 32 비트 int 유형 오히려 시스템을) 왜냐하면 c 필드 뒤에 3 바이트의 패딩이 필요하기 때문입니다. 패딩은 (x86 또는 코어 텍스 M3와 같은) 시스템이 필요하지 않을 수 있지만, 컴파일러는 여전히 성능 향상을 위해 추가 할 수

참고. 그것은 그래서 기본적으로 당신이 당신의 구조에서 34 바이트를 가지고 다음 구조가 주소에 배치해야 4.

에 주소 배수로 정렬되어 있기 때문에

+1

+1, 6 바이트 정렬은 이상하게 들리지만 어쩌면 나는 저급에 뒤떨어져 있을지도 모른다. –

+1

음, 그 이름은 오프셋 4에서 시작하고 (그럴듯 함) 34로 확장됩니다. 34는 4의 배수가 아니므로 36으로 끝나기 때문에 9 * 4입니다. 나에게 의미가있다! –

+2

32 비트 경계 (4,8,16,24,32,36, ...)로 정렬 – Mordachai

0

조심 6 바이트, 이상하지, 즉 여러하다 4. 34 이후의 가장 가까운 값은 36입니다.이 패딩 영역은 구조의 크기로 계산됩니다. 언급 한 바와 같이

2

상기 C 컴파일러는 정렬 조건에 대한 패딩을 추가 할 것이다. 이러한 요구 사항은 종종 메모리 하위 시스템과 관련이 있습니다. 어떤 종류의 컴퓨터는 4 바이트와 같은 '멋진'값까지 정렬 된 메모리에만 액세스 할 수 있습니다. 이것은 종종 단어 길이와 동일합니다. 따라서 C 컴파일러는 구조체의 필드를이 값으로 정렬하여보다 쉽게 ​​액세스 할 수있게 할 수 있습니다 (예 : 4 바이트 값은 4 바이트로 정렬되어야 함). 또한 구조체의 맨 아래를 채워 구조체 뒤에 오는 데이터를 정렬 할 수 있습니다 . 나는 다른 이유가 있다고 생각한다. 더 자세한 정보는 this 위키 백과 페이지에서 찾으실 수 있습니다.

1

기본 정렬은 아마도 4 바이트입니다. 30 바이트 요소가 32이거나 구조체 전체가 다음 4 바이트 간격으로 반올림되었습니다.