【问题标题】:Tables/pointers when using IMAGE_FILE_LARGE_ADDRESS_AWARE 32bit - 64bit使用 IMAGE_FILE_LARGE_ADDRESS_AWARE 32 位 - 64 位时的表/指针
【发布时间】:2011-04-28 11:51:18
【问题描述】:

让我问一个非常具体的问题: 当你有一个大数组时有什么区别(内存使用), 或相同大小的大列表(用指针实现)。例如

var a:array[1..1000000] of integer;

type
  po=^p1;
  p1=record
     v:integer; 
     next:po;
  end;
var p:po;

然后创建包含 1000000 个整数的列表。

  1. 指针实现会比数组使用更多的内存吗?
  2. 在 64 位计算机上差异会更大吗,因为 指针是 64 位的。

【问题讨论】:

    标签: delphi 32bit-64bit


    【解决方案1】:

    x86 bpointers 是 4 个字节(32 位)。 x64 指针是 8 个字节(64 位)。

    1. 是的,每条记录的指针大小(即指针大小的 100 万倍)加上指向列表的一个初始指针的大小。
    2. 是的,每条记录至少 4 个字节,初始记录至少 4 个字节。

    在 2. 时,这是最小的尺寸增加。实际大小增加可能更大,这取决于 Embarcadero 将如何在 x64 世界中进行记录打包和字段对齐。

    --杰罗恩

    【讨论】:

    • 谢谢。速度呢?在 64 位机器上对相同结构的相同操作(例如,使用指针创建具有 1.000.000 个节点的列表)是否会比在 32 位机器上慢,因为需要为每个指针保留的内存量会大两倍?
    • 最简单的测试方法就是去做。从 10.000 个节点开始,然后增加。
    【解决方案2】:

    记录大小为 8 字节(在 32 位 Delphi 上),数组为 4 字节(* 长度)。

    假设在即将到来的 64 位 Delphi 中指针的大小为 8 个字节,则记录将是 12 个字节(如果整数保持为 4,我假设)。

    PS:我认为将大数组声明为动态数组会更好,因为动态数组的内存分配在堆上而不是堆栈上。

    【讨论】:

      猜你喜欢
      • 2013-01-11
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2013-12-05
      • 2014-09-22
      • 2011-05-15
      相关资源
      最近更新 更多