프로그래밍/C

네트워크 프로그램시 pack

잘 살아보세 2009. 4. 2. 14:52
[ CnUnix ] in KIDS
글 쓴 이(By): Bohemian (지니)
날 짜 (Date): 2001년 5월 7일 월요일 오전 10시 15분 44초
제 목(Title): [Q] __packed__ 의 용법 ?


typedef __packed__ volatile struct DEV_REG
{
.
.
.
} DEV_REG_TEMPLATE;

위에서 __packed__ 를 왜 쓰는지, 또 그 의미는 무엇인가요?
보통 디바이스의 레지스터를 선언할 때 사용되는것 같은데,,,




[ CnUnix ] in KIDS
글 쓴 이(By): terzeron (the cowboy)
날 짜 (Date): 2001년 5월 7일 월요일 오전 11시 21분 15초
제 목(Title): Re: [Q] __packed__ 의 용법 ?


구조체 안에 위치하는 변수들의 메모리는 일반적으로 int size에 맞춰서
배열됩니다. 이걸 정렬(aligning)이라고 하죠.

예를 들어,
struct {
char a;
int b;
char c;
} foo;
는 a가 1바이트 먹고 뒤에 쓰이지 않는 3바이트가 들러붙습니다. 이걸
패딩(padding)이라고 부릅니다. 다음에 b가 4바이트 먹고, c가 1바이트
먹고 3바이트 패딩이 붙습니다. 모두 int size인 4바이트 단위로
align되는 거죠.

그런데 이렇게 패딩으로 낭비되는 공간이 많다면 메모리를 아껴서 써야
할 프로그램에서는 문제가 될 수 있겠죠. 이래서 패킹(packing)이라는
걸 하는데, 이게 정렬(aligning)에 대립되는 개념이라고 할 수 있습니다.

GCC에서는 struct __attribute__((packed))라고 쓸 수 있고, 다른 C환경에서는
__packed__ struct가 사용됩니다. 또는 #pragma directive를 사용할 수도
있습니다.

어쨌거나 이걸 확인해보고 싶으시면 다음과 같은 예제를 수행해보세요.

#include

int main()
{
struct __attribute__((packed)) {
char a;
int b;
char c;
} foo;
struct {
char a;
int b;
char c;
} bar;

printf("%d\n", sizeof(foo));
printf("%d\n", sizeof(bar));

return 0;
}

그리고는 두 구조체의 b와 c의 순서를 바꿔서 실행해보세요.

첫번째 테스트의 결과는 6과 12이고, 두번째 테스트의 결과는
6과 8입니다. packing의 결과는 계속 같은 게 당연하고, 정렬한
결과는 1(+3)+4+1(+3) = 12와 1+1(+2)+4 = 8이 되는 거죠.





[ CnUnix ] in KIDS
글 쓴 이(By): Zaharang (_자하랑)
날 짜 (Date): 2001년 5월 7일 월요일 오전 11시 32분 02초
제 목(Title): Re: [Q] __packed__ 의 용법 ?



structure나 union을 말그대로 packing하는 용도입니다.

structure에...size가 다른 int, char가 난무하면서 한꺼번에
들어있으면 모양이 이쁘지 않겠죠? 그렇것들을
1,2,4,8... 뭐 이런 우아해보이는(?) 사이즈로 공값들을 채우거나
빼거나 해서 만들어줍니다.

보통 네트웍에서 돌아다닐때 호환문제나 거론하신 레지스터같이 실제
물리적 상황에 매핑하기 편하도록 쓰는 방식입니다.
VC++에서는 #pragma의 형태로 지원하니까

#pragma packed 를 찾아보세요.

**************** 샘플 ******************
typedef struct {
in_addr_t dst;
in_addr_t src;
short size;
} __attribute__ ((packed)) TurnelHeader;