블로그 이미지
초보 용사 꼬마라크. 그림은 만렙 용사 아랑소드 -네이버웹툰 아스란영웅전 발췌
꼬마라크

Notice

Archive

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
  • total
  • today
  • yesterday
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가 되기 이전의 값으로 되돌림.


역시 뭔가 배우는거의 기본은 삽질.. 왕도는 없다.

'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
posted by 꼬마라크