메모리를 접근할 때, Alignment라는 것이 있습다.
packed keyword는 Alignment를 무시할껀지 적용할 껀지를 결정합니다.
가령 윈도우 같은 경우는 4바이트 얼라인먼트를 사용합니다.
무슨 소린가 하믄... 만일 아래와 같이 선언한다면...
type
RTest = record
byFirst :Byte;
nSecond :SmallInt;
nThird :Integer;
end;
SizeOf(RTest) = SizeOf(Byte) + SizeOf(SmallInt) + SizeOf(Integer) 겠죠?
7 1 2 4
그런데, 메모리에 할당되는 것은 총 12바이트가 됩니다.
무신 소린가 하믄, 처음 byFirst에서 사용되는 것은 1바이트 지만 얼라인먼트가
적용되므로 4바이트, 두번째 nSecond도 2바이트지만 4바이트 이렇게
적용된다는 거죠.
packed가 적용되면 정확히 7바이트만 할당되죠... 얼라인먼트를 무시하니깐..
좀더 정확히 말하자믄 8바이트가 할당됩니다. 7에 가장 가까운 4의 배수가
8이니깐요...
이기종간의 통신에서 서로의 얼라인먼트가 다를 경우 쓰레기 데이터를 받을
수도 있기 때문에 packed를 사용해야 합니다.
(예전에 어떤 시스템은 packed가 안된다고 하던데 까먹었군요...ㆀ)
C++ 과 비교해서 야그하면 #pragma의 packlength와 비슷합니다.
예제.
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;
헉헉헉.. 즐입다.
packed keyword는 Alignment를 무시할껀지 적용할 껀지를 결정합니다.
가령 윈도우 같은 경우는 4바이트 얼라인먼트를 사용합니다.
무슨 소린가 하믄... 만일 아래와 같이 선언한다면...
type
RTest = record
byFirst :Byte;
nSecond :SmallInt;
nThird :Integer;
end;
SizeOf(RTest) = SizeOf(Byte) + SizeOf(SmallInt) + SizeOf(Integer) 겠죠?
7 1 2 4
그런데, 메모리에 할당되는 것은 총 12바이트가 됩니다.
무신 소린가 하믄, 처음 byFirst에서 사용되는 것은 1바이트 지만 얼라인먼트가
적용되므로 4바이트, 두번째 nSecond도 2바이트지만 4바이트 이렇게
적용된다는 거죠.
packed가 적용되면 정확히 7바이트만 할당되죠... 얼라인먼트를 무시하니깐..
좀더 정확히 말하자믄 8바이트가 할당됩니다. 7에 가장 가까운 4의 배수가
8이니깐요...
이기종간의 통신에서 서로의 얼라인먼트가 다를 경우 쓰레기 데이터를 받을
수도 있기 때문에 packed를 사용해야 합니다.
(예전에 어떤 시스템은 packed가 안된다고 하던데 까먹었군요...ㆀ)
C++ 과 비교해서 야그하면 #pragma의 packlength와 비슷합니다.
예제.
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;
헉헉헉.. 즐입다.