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 바이트가 차이가 나야 되는게 아닌가요?
레코드의 필드별로 무조건 4바이트씩 차지한다면 메모리 낭비가 심해지죠...
델파이에서 일반적인 레코드형은 Word/Double-Word단위로 정렬합니다.
RTest의 경우 아래와 같이 됩니다.
byFirst(1Byte) + Dummy(1Byte) + nSecond(2Byte) + nThird(4Byte)
^^ 항상 즐코하세요...