当前位置:主页>销售管理软件> 列表

Delphi的BUG,望指教??? 找进销存软件

销售管理软件版1楼: TData1 =record
i:Integer;
SendID: array[1..20] of Char;
end;

TData2 =record
i:Integer;
SendID: array[1..30] of Char;
end;

var a:TData1 ;
b:TData2 ;

使用sizeof(a)结果是24,sizeof(b)结果是36而不是34,问题出在何处,请指教!

2楼: 这是因为编译器内存对齐作用导致的,Delphi默认选项是按8字节对齐的,也就是说即使你的声明是这样:
TData1 =record
i:Integer;
SendID: array[1..1] of Char;
end;
SizeOf(TData1)也返回是8。 但如果你更改一下编译选项,比如改为按4字节对齐,返回的结果就是5。 具体可参考:
Record field alignment Aligns elements in structures to the specified number of bytes (1, 2, 4, or 8). Choose the alignment type from the drop-down list. Corresponds to {$A}. Note: In older versions of Delphi, this option could be checked on or off. Choosing 1 is the equivalent of off and 8 is the equivalent of on. 如进销存软件

3楼: 谢谢xianjun指教!
那我想请教一下,这个对齐参数是只影响sizeof的返回数值,还是改变了结构的实际大小,比如在 TData2结构后面再多分配了两个字节的空间?

4楼: 改变结构实际大小
内存对齐在record里面还有成员对齐,结构(record)对齐
TData2后面多两个字节是为了结构对齐(以4对齐)
原理:
1、第一个record成员放在offset为0的地方,以后每个数据成员的对齐按照编译器指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、record本身对齐,对齐将按照编译器指定的数值和record最大数据成员长度中,比较小的那个进行。

5楼: r = Record
是按照四个字节对其的,即cpu的字长,主要目的是为了加快寻址速度
32位处理器下
不满4字节补为4字节
r = packed Record
是根据字节对其的

6楼: 现在明白了,感谢三位的解答!