I은 5 바이트에 달하는,이 4 바이트를 취하고 그 1 바이트를 취하도록 c
는 숯 가변되도록 구성메모리 구조에 할당
typedef struct EData
{
int a;
char c;
}
Edata obj;
a
는 정수 변수가
하지만 sizeof(obj)
을 인쇄하면 8 바이트이 표시됩니다.
이유가 무엇입니까?
I은 5 바이트에 달하는,이 4 바이트를 취하고 그 1 바이트를 취하도록 c
는 숯 가변되도록 구성메모리 구조에 할당
typedef struct EData
{
int a;
char c;
}
Edata obj;
a
는 정수 변수가
하지만 sizeof(obj)
을 인쇄하면 8 바이트이 표시됩니다.
이유가 무엇입니까?
있기 때문에 4 바이트의 여러에있다, 그래서 메모리가 4byte (32bit)
경계에 정렬 32 비트 시스템 : 당신이 결국 무엇
이 같은 것입니다 당신은 #pragma
이나 컴파일러 스위치를 사용할 수 있습니다 (다양한 컴파일러에는 그러한 스위치가 있습니다).
int
은 4 바이트, char
은 1 바이트입니다. 그러나 성능을 향상 시키므로 컴파일러 aligns each struct
to a word (32 비트 아키텍처에서는 4 바이트)입니다. 따라서 EData
의 각 인스턴스는 2 단어 (또는 8 바이트)로 반올림됩니다. 그것이 문제가 있다면 Data structure alignment
를 참조
typedef struct EData {
int a;
char c;
char padding[3];
}
크기가 커지면 컴파일러의 패딩 때문입니다.
컴파일러는 올바른 바이트 경계를 적용하기 위해 여분의 바이트를 추가합니다.
그래서 컴파일러는 추가 바이트를 추가하여 유형에 따라 각 멤버의 적절한 위치를 적용합니다.
이 작업을 수행하려면 컴파일러에서 멈출 수있는 옵션이 있습니다 (패킹 된 지시문).하지만 피하는 것이 가장 좋습니다 (구석의 경우 제외)
기본적으로 [구조체의 크기는 어떻게 구합니까?] http://stackoverflow.com/questions/143025/how-do-i-find-the-size-of-a-struct) –