【问题标题】:How to get the memory size of a dynamic array?如何获取动态数组的内存大小?
【发布时间】: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


【解决方案1】:

动态数组的元素之间没有填充,Length(MyArray)*SizeOf(Element) 应该是准确的。

【讨论】:

    【解决方案2】:

    事实上,length(MyArray) * sizeof(element) 对于数组内容是准确的不包括任何内部动态数组或字符串。

    如果您希望整个数组使用内存,包括嵌套引用类型的内容大小,您可以使用我们的TDynArray 包装器。它能够将任何动态数组序列化为二进制,包括引用计数成员(如动态数组或字符串)。为此,您有 SaveTo / SaveToStream 方法,并且您可以获得所有内容的实际大小。

    看看at this blog article,它展示了这个包装器。它是开源的,适用于从 Delphi 5 到 XE4 的 Win32 和 Win64 平台。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2018-09-10
      • 2020-02-18
      • 2013-09-05
      相关资源
      最近更新 更多