2010-12-31 6 views
1

I은 ​​5 바이트에 달하는,이 4 바이트를 취하고 그 1 바이트를 취하도록 c는 숯 가변되도록 구성메모리 구조에 할당

typedef struct EData 
{ 
    int a; 
    char c; 
} 
Edata obj; 

a는 정수 변수가

하지만 sizeof(obj)을 인쇄하면 8 바이트이 표시됩니다.

이유가 무엇입니까?

+2

기본적으로 [구조체의 크기는 어떻게 구합니까?] http://stackoverflow.com/questions/143025/how-do-i-find-the-size-of-a-struct) –

답변

4

있기 때문에 4 바이트의 여러에있다, 그래서 메모리가 4byte (32bit) 경계에 정렬 32 비트 시스템 : 당신이 결국 무엇

이 같은 것입니다 당신은 #pragma이나 컴파일러 스위치를 사용할 수 있습니다 (다양한 컴파일러에는 그러한 스위치가 있습니다).

+1

별로는 아니지만 * 모든 메모리가 4 바이트 단위로 정렬됩니다. 예를 들어,'char' 요소만을 포함하는 구조체는 4의 배수가 아닌 크기를 쉽게 가질 수 있습니다. – psmears

+0

그런 요소에 액세스하는 동안 정렬되지 않은 메모리 액세스가 생성되지 않습니까? – ismail

+0

또한 Visual Studio에서'#pragma pack (1)'을 사용하여 정렬을 1 바이트로 설정할 수 있습니다. 그런 다음 5 바이트를'sizeof (Edata)'로 가져와야합니다. – RedX

3

int은 4 바이트, char은 1 바이트입니다. 그러나 성능을 향상 시키므로 컴파일러 aligns each struct to a word (32 비트 아키텍처에서는 4 바이트)입니다. 따라서 EData의 각 인스턴스는 2 단어 (또는 8 바이트)로 반올림됩니다. 그것이 문제가 있다면 Data structure alignment

0

를 참조

typedef struct EData { 
    int a; 
    char c; 
    char padding[3]; 
} 
1

크기가 커지면 컴파일러의 패딩 때문입니다.
컴파일러는 올바른 바이트 경계를 적용하기 위해 여분의 바이트를 추가합니다.
그래서 컴파일러는 추가 바이트를 추가하여 유형에 따라 각 멤버의 적절한 위치를 적용합니다.
이 작업을 수행하려면 컴파일러에서 멈출 수있는 옵션이 있습니다 (패킹 된 지시문).하지만 피하는 것이 가장 좋습니다 (구석의 경우 제외)