서로 다른 언어로 구성되어 있거나, 다른 프로그램에서 데이터를 공유하고자 할때는 여러가지 사항을 고려해야 한다.
그중 구조체를 주고받을 때 특히 문제가 많이 발생하는데, C/C++ 과 Delphi의 레코드 정렬방식에
대한 내용은 알아두는게 좋다.
C/C++ 부분
#pragma pack(push)
#pragma pack(1)
// #pragma pack(push,1)
typedef struct packedStructure {
....
} packedStructure;
#pragma pack(pop)
Delphi 부분
type
packedStructure = packed record
....
end;
C언어에서의 #pragma pack을 이용하여 struct member alignment을 설정하며 테스트 해 보자.
#pragma pack(n) //n=1, 2, 4, 8, 16
#pragma pack() //default 값으로 설정
#pragma pack(n)은 다른 #pragma pack(n) 또는 #pragma pack()을 만날 때까지 모든 struct, class의 struct member alignment에 적용이 된다.
struct noPack {
char ;
int i;
};
printf("%s ", sizeof(noPack)); //4+4
struct Pack {
char c;
int i;
};
#pragma pack() //default 값으로 복원
printf("%s ", sizeof(Pack)); //2+4
보통 소켓통신 프로그램에서 데이터를 주고 받을때에는 #pragma pack(1)로 설정을 하여, 구조체상의 빈공간(? : padding)을 모두 없앤 후, 실제 데이터만 보내고, 받는 쪽에서도 동일한 형태를로 받도록 작성을 한다.
만일 특정 헤더 파일의 전체 struct, class의 struct member alignment를 1로 설정하고 싶다면, 아래와 같이 사용한다.
#include "헤더파일"
#pragma pack()
※ 강제로 struct member alignment를 설정하게 되면 Default 값보다는 처리속도가 느려진다.