【发布时间】:2013-07-12 03:04:17
【问题描述】:
在 Delphi 中,您可以使用 sizeof() 编译器魔术函数获取值类型的大小,但在引用类型上调用 sizeof() 会得到指针的大小,而不是它指向的值。
对于对象,您可以使用InstanceSize 方法获取内存大小,但是对于动态数组呢?由于填充,length(MyArray) * sizeof(element) 可能不准确。那么,有没有准确的方法来获取动态数组的内存大小呢?
【问题讨论】:
-
我已经有一段时间没有在 Delphi 中进行指针计算了,但是这个:
PChar(@MyArray[last+1]) - PChar(@MyArray[0])呢?当然,last + 1可能会导致索引越界异常,因此您可能想改用last并计算每个元素的 real 大小(填充和所有)并将其添加到它. -
我不确定在 Borland 编译器的世界中是否有任何数组元素填充。
-
There is no padding。你可以使用
Length(MyArray) * SizeOf(Element)。 -
数组元素之间没有填充,但是数组元素前面有隐藏数据来保存数组的引用计数等。所以
Length(MyArray) * SizeOf(ElementType)会告诉你分配了多少字节来保存数组的元素数据,但它不会告诉你为整个动态数组分配了多少字节。 -
但我怀疑乘积的 length*sizeof 仍然是 Mason 所追求的,不是吗?
标签: delphi