답변 감사합니다 ^^
필요한 분들이 참고 할수 있게 제가 지식을 얻었던 관련 링크 걸어 봅니다.
http://en.wikipedia.org/wiki/Data_structure_alignment
송신영 님이 쓰신 글 :
: 필요한 구조체에만 padding 문제를 해결하려면
: #pragma pack() 을 참고하세요.
:
:
: #pragma pack(1) // 1 Byte
: struct MyStruct{
: int i;
: double d;
: short int s;
: };
: #pragma pcak() // 해제
:
:
:
:
: 빌더초보 님이 쓰신 글 :
: : Data alignment 라게 있군요.
: :
: : 답변 감사 합니다!
: :
: :
: : 님이 쓰신 글 :
: : : C++ 컴파일러 옵션에 보시면 Data alignment항목이 있습니다.
: : : 기본이 32비트 ( 32비트 컴파이러니까) 로 되어있으며
: : : 32비토보다 작은 자료형은 32비트칸에 맞추어서 정렬(얼라인먼트)되는 것입니다.
: : : 예를 들면 한칸이 32비트인 원고지에 글자를 적는것과 같습니다.
: : :
: : : 이 옵션을 16비트 (2바이트 즉 word)로 바꾸면 구조체내에서 빈 공간이 없이 채워질 겁니다.
: : : 하지만 이런 구조체를 대량으로 처리한다면 속도가 떨어집니다.
: : : 프로세서는 한걸음에 32비트씩 처리하는데 중간중간에 반걸음씩 후진하여야하는 작업을 하여야하니까요.
: : :
: : :
: : :
: : :
: : : 빌더초보 님이 쓰신 글 :
: : : : c++에서 binary 포멧 으로 저장한 파일을 Matlab에서 불러와야 할 일이 있었습니다.
: : : :
: : : : 구조체로 저장한 부분을 변수가 선언된 순서대로 변수 하나씩 꺼내는데,
: : : :
: : : : 결과가 원래 저장한 값과 다르더군요.
: : : :
: : : :
: : : :
: : : : 예를들면,
: : : :
: : : :
: : : :
: : : : struct TEST{
: : : : short s;
: : : : int i;
: : : : double d;
: : : : };
: : : :
: : : : TEST t;
: : : :
: : : : t.s=2;
: : : : t.i=4;
: : : : t.d=8;
: : : :
: : : :
: : : : TMemoryStream *ms = new TMemoryStream;
: : : : ms->Write(&t,sizeof(TEST));
: : : :
: : : : ms->Position=0;
: : : :
: : : : short s;
: : : : int i;
: : : : double d;
: : : :
: : : : ms->Read(&s,2);
: : : : ms->Read(&i,4);
: : : : ms->Read(&d,8);
: : : :
: : : : Memo1->Lines->Add(s);
: : : : Memo1->Lines->Add(i);
: : : : Memo1->Lines->Add(d);
: : : :
: : : :
: : : :
: : : : 이와 같이 했더니 아래와 같은 결과가 나오더군요.
: : : :
: : : : 2
: : : : 262144
: : : : 0
: : : :
: : : : 조금 삽질을 하다보니
: : : :
: : : :
: : : : ms->Read(&s,2);
: : : : ms->Seek(2,soFromCurrent);
: : : : ms->Read(&i,4);
: : : : ms->Read(&d,8);
: : : :
: : : :
: : : : 위 처럼 short 를 불러오고 2 바이트 옮긴 후 int 와 double 을 불러와야 정상적인 값을 얻을수 있었습니다.
: : : :
: : : :
: : : : 짧게 요약을 하면..
: : : :
: : : : struct TEST{
: : : : short s;
: : : : int i;
: : : : double d;
: : : : };
: : : :
: : : : 와 같은 구조체를 저장할 시
: : : :
: : : :
: : : : 0123456789ABCDEF --> 메모리상 0~16까지의 공간(byte)
: : : : s_i___d_________ <-- 이렇게 저장될 줄 알았는데
: : : : s___i___d_______ <-- 이렇게 저장되어 있었더라..
: : : :
: : : :
: : : : 는 말입니다.
: : : :
: : : : 왜 이럴까요?
: : : :
: : : :
: : : :
: : : :
: : : : 또 이것 저것 실험을 하다보니
: : : :
: : : : struct TEST{
: : : : int i;
: : : : double d;
: : : : short s;
: : : : };
: : : :
: : : : 이 처럼 double 형이 가운데 있을때는 TEST 구조체의 크기가 24바이트가 되더군요.
: : : :
: : : : 이건 또 왜이럴까요?
: : : :
: : : :
: : : : 변수를 저장할 때 bit가 역순으로 저장 되는 것과 상관이 있을까요?
: : : :
: : : :
: : : :
: : : : 아시는 분은 답변 부탁드립니다.