|
0. 얼마나 할당(정렬)될까?
- 4 비트 마이크로프로세스에서는 니블(4 bit)씩 정렬됩니다. (믿거나 말거나 -_-)
- 8 비트 도스에서는 1 바이트씩 정렬됩니다.
- 16 비트 Win3.1에서는 2 바이트씩 정렬됩니다. (요건 자신없군요)
- 32 비트 Win9X에서는 4 바이트씩 정렬됩니다. (요것도 자신없군요 -_-)
- 그 뒤로는.. 컴파일러에서 정하기 나름입니다. (OS에 영향 타는지는 모르겠지만 XP를 쓰는 제 노트북에서는 VC++이나 Builder나 둘 다 8 byte 정렬을 하는군요)
1. Builder 컴파일로 옵션으로 설정하기
- Ctrl+Shift+F11을 눌러 프로젝트 옵션을 엽니다.
- Advanced Compiler를 선택합니다.
- Data Alighment를 찾아서 Byte(1 byte 정렬), Word(2 byte 정렬), Double word(4 byte 정렬), Quod Word(8 byte 정렬) 중 원하는 대로 고릅니다.
- 각각 리빌드 올을 해서 sizeof(Bit)로 크기를 한번씩 찍어 봅니다.
- 구조체가 선택한 대로 할당되어 있을 겁니다. (프로젝트에서 사용한 모든 구조체에 적용됩니다)
2. 전처리 매크로 사용하기
- #pragma pack(push, 1), #pragma pack(push, 2), 기타 등등 원하는 대로 구조체 앞에 써 줍니다.
- 각각 리빌드 올을 해서 sizeof(Bit)로 크기를 한번씩 찍어 봅니다.
- 구조체가 선택한 대로 할당되어 있을 겁니다. (단, #pragma가 선언된 이후로 선언된 구조체에 대해서만 적용됩니다)
- 특정 구조체만 정렬하고 싶으면 구조체 앞에서 #pragma pack을 한 후 구조체 뒤에서 #pragma pack(pop, 1), #pragma pack(pop, 2), 기타 등등을 합니다. (push와 pop 사이에 있는 것만 뒤에 써 준 크기만큼 할당됩니다)
- 아래는 예제입니다
#pragma pack(push, 1)
struct stBit
{
char cStartByte;
char szData[21];
char cEndByte;
};
#pragma pack(pop, 1)
김상면 님이 쓰신 글 :
: 님들 정부 기관에서 사용하면 대체로 100%확실한거 맞지요?
:
: 제가 C언어 책을 한권 읽었는대 그책에서는 아래의 구조체가
: struct Bit
: { int Busy : 1;
: int Not1 : 2;
: int Ready : 1;
: };
:
: 2바이트 할당된다 합니다.
: 모 정부기관 박사님은 1바이트 할당된다고 합니다.
: 어떤이는 컴파일러 마음이라고합니다.
: 어떤 책은 반 바이트 할당된다고 합니다.
:
: 저의 개인적인 생각으로는 컴파일러가 워드 정열을 하므로 2바이트 할당이 맞다고 보는데 어느게 정말이에요?
: 2바이트 할당이 맞지요???
: 그럼
|