Q&A

  • record 와 packed record 의 메모리 차이 설명종 해주세요?
type
   RTest = record
                  byFirst :Byte;
                  nSecond :SmallInt;
                  nThird :Integer;
               end;

   RTest2 = packed record
                  byFirst :Byte;
                  nSecond :SmallInt;
                  nThird :Integer;
               end;
var
   arTest :array [0..1] of RTest;
   arTest2 :array [0..1] of RTest2;
begin
   ShowMessage('packed가 없을 때 메모리 차이 ' +
                          IntToStr( Integer(@arTest[1]) - Integer(@arTest[0])) );
   ShowMessage('packed가 있을 때 메모리 차이 ' +
                          IntToStr( Integer(@arTest2[1]) - Integer(@arTest2[0])) );
end;
여기에서 record 는 Alignment 를 사용해서 window인경우 4바이트를 사용한다고하는데 showmessage 처러 해서 바이트의 차이를 보면

packed record 는 7
record 는 8 이더군요

packed 인경우
SizeOf(RTest) = SizeOf(Byte) + SizeOf(SmallInt) + SizeOf(Integer)
      7                            1                  2                     4
이고
record 인경우
SizeOf(RTest) = SizeOf(Byte) + SizeOf(SmallInt) + SizeOf(Integer)
      12                            4                  4                     4
이렇게해서 12 바이트가 차이가 나야 되는게 아닌가요?
1  COMMENTS
  • Profile
    최용일 2004.05.28 03:23
    안녕하세요. 최용일입니다.

    레코드의 필드별로 무조건 4바이트씩 차지한다면 메모리 낭비가 심해지죠...

    델파이에서 일반적인 레코드형은 Word/Double-Word단위로 정렬합니다.

    RTest의 경우 아래와 같이 됩니다.
    byFirst(1Byte) + Dummy(1Byte) + nSecond(2Byte) + nThird(4Byte)

    ^^ 항상 즐코하세요...