老问题,有关记录中字段的对齐问题?(15分)

  • 主题发起人 主题发起人 Archerfl
  • 开始时间 开始时间
A

Archerfl

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码:
type
TMyR = record
a: real;
c: char;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(SizeOf(TMyR)));
end;
结果显示为16,为什么呢?还有在Project->Compiler->Record field alignment做什么的,
如何用呢?
 
//结果显示为16,为什么呢?
这就是对齐呀,为了提高效率,默认情况下,Delphi 为我们将记录对齐(编译器选项)
当然,这样浪费了空间,当对空间要求高的时候,可以申请压缩记录(就是不对齐):
type
TMyPackRec = packed record
a: real;
b: char;
end
// sizeof(TMyPackRec) = 9;

//Project->Compiler->Record field alignment 就是规定对齐字节数的啊
看你刚才的例子,1 字节的 char 就被对齐为 8 位了,这个 8 就是在这里设的啊
 
to beta:
如果不加packed则Delphi会对记录中的字段进行对齐,那么对齐原则是什么呢?
   产生对齐的目的是为了加快系统访问数据的速度,在我所举的例子中,假如改为:
   type
     TMyR = record
      c: char;
     a: real;
    end;
由于为了对a进行对齐,因为a要占用8个字节,所以它应该从0,8,16...等地址处开始
读取,所以c只占了头一个字节,然后浪费掉7个字节,但是在我所举的例子中为什么c也会
如上这样呢?这时a已经占用了它的头8个字节呀!在我看来应该是( 8 + 1 = 9 才对!)
另外,这个编译选项是如何使用的,不会仅是对于一个字节的char来说的吧,请您举
个例子!谢!
 
一般的看法是不建议用一个byte,这样不好处理边界对齐,最好是4个byte,用
0填充
 
//那么对齐原则是什么呢?
不就是你的编译器默认设置吗?:
Project->Compiler->Record field alignment 默认为 8
就是 8 字节对齐呀(地址为 8 的整数倍)
 
to beta:
   我测试了一下,发现不论设置Record field alignment选项为何值8,4,2,1该例显示
结果均为16,根本不受影响,那么这又是什么呢?
 
用编译指令:
{$A8} 默认为 8 字节对齐
{$A4} 代表 4 字节对齐
{$A2}, {$A1} 类似

当设置为 {$A4} 时,sizeof(TMyR) 为 12 没有问题!
 
to beta:
采用编译指令后,确实正常了,那Borland设置那个选项有什么用呢?改不改它根本不
影响记录的大小值呀?
 
我也觉得奇怪:)
 
多人接受答案了。
 
后退
顶部