一
一个过客
Unregistered / Unconfirmed
GUEST, unregistred user!
最近用java做一个网络项目,服务器端软件(C++代码)已经提供了TCP/IP接口,只不过它的数据结构是8字节对齐的,java很难实现,因此我开始研究8字节对齐的内部实现,正好delphi比较熟悉,而且delphi也支持8字节对齐,因此就用delphi来开始研究吧。
我知道,当我们在delphi中定义如下数据结构,在默认情况下应该就是8字节对齐的:
现在我定义一个变量,并且赋值,然后看看内存中数据是怎么排列的:
按照我的想象,现在s这个数组里面的数据应该是这样的(共24个字节,数据用16进制显示,X表示无效字节,用于填充空位):
[a] [11] [11] [x] [x] [x] [x] [x] [22] [22] [22] [22] [22] [22] [22] [22] [33] [33] [33] [33] [x] [x] [x] [x]
也就是说,为了保证8字节对齐,第一个字节a和后面的两个字节$1111,再加上5个填充字节,构成第一个8字节段,中间8个$2222222222222222构成第二个8字节段,最后四个字节$33333333加上4个填充字节,构成第三个8字节段,总共是24个字节;
但是当我一个一个检查s数组内数据的时候,我发现内存排列并不是这样的,而是:
[red][a] [8] [11] [11][/red] [x] [x] [x] [x] [22] [22] [22] [22] [22] [22] [22] [22] [33] [33] [33] [33] [x] [x] [x] [x]
也就是说,第二个域$1111并没有紧挨着第一个域排列,它们之间有一个$8,这个$8可能也是一个无效的填充字节。这是什么规律呢?
因此我的疑惑就是,delphi里面的8字节对齐,究竟内部实现的规律是什么?它的实现方法是否是标准的?
我知道,当我们在delphi中定义如下数据结构,在默认情况下应该就是8字节对齐的:
代码:
TTest = record
a:char;
b:word;
c:int64;
d:integer;
end;
现在我定义一个变量,并且赋值,然后看看内存中数据是怎么排列的:
代码:
var t:TTest;
s:array of char;
begin
t.a:='a';
t.b:=word($1111);
t.c:=int64($2222222222222222);
t.d:=integer($33333333);
setlength(s,sizeof(t));
fillchar(s[0],sizeof(t),#0);
copymemory(@s[0],@t,sizeof(t));
[a] [11] [11] [x] [x] [x] [x] [x] [22] [22] [22] [22] [22] [22] [22] [22] [33] [33] [33] [33] [x] [x] [x] [x]
也就是说,为了保证8字节对齐,第一个字节a和后面的两个字节$1111,再加上5个填充字节,构成第一个8字节段,中间8个$2222222222222222构成第二个8字节段,最后四个字节$33333333加上4个填充字节,构成第三个8字节段,总共是24个字节;
但是当我一个一个检查s数组内数据的时候,我发现内存排列并不是这样的,而是:
[red][a] [8] [11] [11][/red] [x] [x] [x] [x] [22] [22] [22] [22] [22] [22] [22] [22] [33] [33] [33] [33] [x] [x] [x] [x]
也就是说,第二个域$1111并没有紧挨着第一个域排列,它们之间有一个$8,这个$8可能也是一个无效的填充字节。这是什么规律呢?
因此我的疑惑就是,delphi里面的8字节对齐,究竟内部实现的规律是什么?它的实现方法是否是标准的?