구조체 할당은 일반적으로 4 바이트 경계에서 발생합니다. 즉, 컴파일러는 다음 데이터 형식으로 시작하기 전에 4 바이트 경계까지 구조체 내의 데이터 형식을 채 웁니다.
sizeof(blockHeader) == 8
sizeof(struct blockHeader) == 8
sizeof(blockHeaderPtr) == 4
(참고 :이 C++의 것을 감안할 때
struct blockHeaderStruct {
bool allocated; // 1 byte followed by 3 pad bytes
unsigned int length; // 4 bytes
};
typedef struct blockHeaderStruct blockHeader;
typedef struct blockHeaderStruct *blockHeaderPtr;
를 sizeof 작업이 될 것입니다 (부울 뭔가로 #define한다 할 필요)이 아닌 C (부울는 sizeof 연산자 1) 마지막 항목은 64 비트 컴파일러의 경우 8입니다.)
처음 두 줄의 코드 사이에는 크기에 차이가 없어야합니다. typedef는 단순히 기존 유형에 별명을 지정합니다. 세 번째는 32 비트 머신에서 4 바이트이고 64 비트 머신에서 8 바이트 인 포인터 크기를 취하는 것입니다.
이 문제를 해결하려면 구조체를 정의하기 전에 #pragma pack 지시어를 적용하면됩니다. 이렇게하면 컴파일러가 지정된 경계에 압축합니다. 일반적으로 1, 2 또는 4로 설정됩니다 (일반적으로 4가 기본값이며 설정하지 않아도 됨).
#include <stddef.h>
#include <stdio.h>
#pragma pack(1)
struct blockHeaderStruct {
bool allocated;
unsigned int length;
};
typedef struct blockHeaderStruct blockHeader;
int main()
{
printf("sizeof(blockHeader) == %li\n", sizeof(blockHeader));
printf("sizeof(struct blockHeader) == %li\n", sizeof(struct blockHeaderStruct));
return 0;
}
그램로 컴파일 ++ (우분투 4.4.1-4ubuntu9)에서 4.4.1
결과 :
sizeof(blockHeader) == 5
sizeof(structblockHeader) == 5
당신은 일반적으로이 지침이 필요하지 않습니다. 구조체를 효율적으로 팩하는 것을 잊지 마십시오. 더 작은 데이터 유형을 함께 그룹화하십시오. 구조체가 주로 사용되지 않는 공간이기 때문에 대체 바이트 < 4 바이트 데이터 유형과 4 바이트 데이터 유형을 사용하지 마십시오. 이로 인해 네트워크 관련 응용 프로그램에 불필요한 대역폭이 발생할 수 있습니다.
'sizeof' 포인터를 사용하지 않으시겠습니까? – Potatoswatter
또한 http : //en.wikipedia의 패딩 때문에.org/wiki/Data_alignment에서 예상 값은 5가 아니라 8입니다. – Potatoswatter
어떤 플랫폼입니까? 어느 컴파일러인가? –