为什么我定义的Record类型的变量MyRec的SizeOf(MyRec)不等于MyRec中的各种类型的长度之和? (100分)

  • 主题发起人 主题发起人 lwen
  • 开始时间 开始时间
L

lwen

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我定义的Record
MyRec = Record
a: Array[0..3] of char;
b: char;
c: char;
d: LongInt;
e: LongInt;
f: LongInt;
end;
SizeOf(MyRec) = 20
而实际上长度为4+1+1+4+4+4=18
 
看帮助里面那个sizeof的函数,运算结果是46,而看起来应该是44,刚好差2,
关注
 
在编绎开关中有个选项,是否对齐域: Aligned record fields.如果选了这个选项的话,Delphi
会把你的记录中的域按字节对齐,就有可能造成多出一两个字节,所以你上面的结构中
a:array[0..4]长度为5个字节
b:char:长度为1个字节
c:char:长度为1个字节
下面是三个4个节的整型,所以Delphi做了对齐后,把前面的占了8个字节,这样加上下面的12个
字节,正好是20个字节.
 
你用MyRec = packed Record
我查了D5的help:
By default, the values in a structured type are aligned on word or double-word
boundaries for faster access. When you declare a structured type,
you can include the reserved word packed to implement compressed
data storage.

 
对不起写错了应该是
a: Array[0..3] of char;

 
请proman兄,再给一个详细的分析,谢谢。
 
结果也一样,不过如果你声明成 packed record,那么那个编绎开关就不起作用了.
 
>>而实际上长度为4+1+1+4+4+4=18 wrong
5+1+1+4+4+4=19 right

原因:
record记录是按最长的类型分配空间的,你的MyRec里最长的数据类型是longint,所以分配的空间就是4的倍数。

 
project--->options--->compiler--->Record field alignment--->选择你要的数值,如果选1,则就是实际的size.
 
多人接受答案了。
 
很简单啊,数据存储为了读取的快,有时就需要对齐,如你上面的例子,前面读出的是4个字节的
Char,后面又是2个字节的Char,再是3个4个字节的整型,要知道系统读取的进候一般不会一个
字节一个字节的读,一般是一个字或双字的读,所以如果按照你的想法,数据不对齐,而是挨着
存的话,读出来后就需要折分,而且比较烦还影响速度,所以在不影响存储空音的前提下可以做
对齐处理,也就是按照最好读和写的方式存储.所以你上面的结构存盘时,前8个字节的前6个字节
是你的前三个域的,后面12个字节是三个整型的,读的快又好写.如果你对数据存储没有特别的
要求的话,如记录很多,很占地方,有可能造成巨大的空间浪费等,不必在意.但有一点要注意
就是你要保证编绎开关的致性,否则你写下的文件,换了编绎开关以后,读出来就不对了
 

MyRec = Record
a: Array[0..3] of char;
b: char;
c: char;
d: LongInt;
e: LongInt;
f: LongInt;
end;
没用pack,所以按字(1 word=2byte)对齐:4+2+2+4+4+4=20
 
后退
顶部