별로 중요하지 않다. 기존의 struct member alignment만 반드시 알고 있으면 된다.
이번시간에는 struct member alignment를 어떻게 설정하는지에 대해서 설명을 한다.
1.전역적으로 struct member alignment 설정 방법
struct member alignment의 기본값은 8이라고 했다.
맞는지, 그리고 어떻게 설정하는지 살펴보자.
Project>Settings => C/C++에서 Category를 Code generation으로 선택하면,
Struct member alignment가 "8 Bytes *"로 선택되어 있는 것을 볼 수 있다.
이를 만일 4Bytes로 변경을 하면, 아래의 Project options(컴파일 옵션임)의 /Zp4로 변경됨을 볼 수 있다(/Zp 표시가 없으면 default 8, Project options에서 직접 수정을 해도 반영됨).
2.지역적으로 struct member alignment 설정 방법
#pragma pack을 이용하여 struct member alignment을 설정할 수 있다.
사용방법은
#pragma pack(n) //n=1, 2, 4, 8, 16
#pragma pack() //default 값으로 설정
위의 보기처럼
int n=2;
#pragma pack(n)
으로 하면, warning C4079: unexpected token 'identifier', warning C4081: expected 'newline'; found ')' 두개의 warning이 나타나고 적용이 되지 않는다. 이는 #pragma가 preprocessor에 의해 동작이 되는데, 이때 n의 값은 알 수가 없기 때문이다. n대신 직접적으로 숫자(#pragma pack(2))를 써주거나, #define된 것으로 설정해야한다.
//default 8
struct A {
char c;
int i;
};
printf("%s ", sizeof(A)); //4+4
부분의 struct member alignment를 2로 설정하고 싶으면,
#pragma pack(2)
struct A {
char c;
int i;
};
#pragma pack() //default 값으로 복원
printf("%s ", sizeof(A)); //2+4
이 된다. 보통 통신 프로그램에서 데이터를 보낼 때 #pragma pack(1)로 설정을 하여, padding을 모두 없애고 실제 데이터만 보내고, 받는 쪽에서도 동일하게 받도록 작성을 한다.
#pragma pack(n)은 다른 #pragma pack(n) 또는 #pragma pack()을 만날 때까지 모든 struct, class의 struct member alignment에 적용이 된다.
만일 A.h 파일의 전체 struct, class의 struct member alignment를 1로 설정하고 싶다면,
#pragma pack(1)
#include "A.h"
#pragma pack()
을 하면 된다.
하지만 강제로 struct member alignment를 설정하는 것은 default 값보다는 처리속도가 느려진다. 그래서 이런 것이 있다는 것 정도만 알고 넘어가고, 이전에도 말했듯이, 접근자(., ->)를 이용하여 struct member를 명시적으로 접근하여 사용하기를 바란다.
댓글 없음:
댓글 쓰기