2007. 12. 14. 21:59
Programmer/Network Prog.
byte align방법 : 과연 몇바이트를 얼라인 할것이냐..
우선 샘플 스트럭쳐..
struct shovel {
short armLength; // [2]삽길이
char type; // [1]네모삽,세모삽, 모종삽
char weight; // [1]삽무게
short price; // [2]새 삽 가격
} // 총 6바이트
[-------- --------][--------][--------][-------- --------]
short char char short
해본사람은 안다.. 물론 해봐도 오래전에 해봐서 기억이 가물가물하면 까먹는다.
sizeof(shovel)하면 얼마가 나올까요?
시스템마다 다르것지만.. 8이 나올걸..
삽의 사이즈는 8
실제 스트럭쳐는 6
어허허..-_-
메모리가 몇바이트 단위로 잘려있느냐 하는걸 정하는 것의 차이가 되것다.
vs의 경우 기본값이 intel의경우 8이던가..?-_-(다른것도 8인가?)
실제 6바이트짜리로 선언을 하더라도.. 메모리관리의 편의상..8바이트로 관리된다.
그래서 네트웍 프로그래밍을 할때는 구조체 선언부에서 #pragma pack() 매크로를 써준다
실제 원하는 사이즈의 구조체를 얻기위해.. 안그러면.. 보내는데 중간에 이상한 몇바이트가 끼어있는걸 확인할수 있다
(실제로 봐야 얼마나 황당한지 알수 있다.)
#pragma pack(1) // 1byte align
struct shovel {
short armLength; // [2]삽길이
char type; // [1]네모삽,세모삽, 모종삽
char weight; // [1]삽무게
short price; // [2]새 삽 가격
} // 총 6바이트
#pragma pack() // 원래대로 되돌림.
요러면.. 저 구조체를 6바이트만 갖는 구조체로 쓸수있다 이거지...
또한 stack을 사용가능하다.
#pragma pack(4) // 원래 어쨋든 4로 align
#pragma pack(push, 3) // 4를 스텍에 넣고 3으로 align
#pragma pack(pop) // 스택에서 하나꺼냄. 4로 다시 align
#pragma pack() // 4가 되기 이전의 값으로 되돌림.
역시 뭔가 배우는거의 기본은 삽질.. 왕도는 없다.
우선 샘플 스트럭쳐..
struct shovel {
short armLength; // [2]삽길이
char type; // [1]네모삽,세모삽, 모종삽
char weight; // [1]삽무게
short price; // [2]새 삽 가격
} // 총 6바이트
[-------- --------][--------][--------][-------- --------]
short char char short
해본사람은 안다.. 물론 해봐도 오래전에 해봐서 기억이 가물가물하면 까먹는다.
sizeof(shovel)하면 얼마가 나올까요?
시스템마다 다르것지만.. 8이 나올걸..
삽의 사이즈는 8
실제 스트럭쳐는 6
어허허..-_-
메모리가 몇바이트 단위로 잘려있느냐 하는걸 정하는 것의 차이가 되것다.
vs의 경우 기본값이 intel의경우 8이던가..?-_-(다른것도 8인가?)
실제 6바이트짜리로 선언을 하더라도.. 메모리관리의 편의상..8바이트로 관리된다.
그래서 네트웍 프로그래밍을 할때는 구조체 선언부에서 #pragma pack() 매크로를 써준다
실제 원하는 사이즈의 구조체를 얻기위해.. 안그러면.. 보내는데 중간에 이상한 몇바이트가 끼어있는걸 확인할수 있다
(실제로 봐야 얼마나 황당한지 알수 있다.)
#pragma pack(1) // 1byte align
struct shovel {
short armLength; // [2]삽길이
char type; // [1]네모삽,세모삽, 모종삽
char weight; // [1]삽무게
short price; // [2]새 삽 가격
} // 총 6바이트
#pragma pack() // 원래대로 되돌림.
요러면.. 저 구조체를 6바이트만 갖는 구조체로 쓸수있다 이거지...
또한 stack을 사용가능하다.
#pragma pack(4) // 원래 어쨋든 4로 align
#pragma pack(push, 3) // 4를 스텍에 넣고 3으로 align
#pragma pack(pop) // 스택에서 하나꺼냄. 4로 다시 align
#pragma pack() // 4가 되기 이전의 값으로 되돌림.
역시 뭔가 배우는거의 기본은 삽질.. 왕도는 없다.
'Programmer > Network Prog.' 카테고리의 다른 글
[링크]Socket 이란? (0) | 2007.12.14 |
---|---|
[링크]socket-client에 bind없는 이유 (0) | 2007.12.14 |
connection-oriented와 connectionless 의 차이 (0) | 2007.12.14 |
buffer와 structure (0) | 2007.12.14 |
host byte order와 network byte order (0) | 2007.12.14 |