代码之家  ›  专栏  ›  技术社区  ›  Amit G

64位dll的大小比32位大50%

  •  10
  • Amit G  · 技术社区  · 15 年前

    我有一个VC++项目(2005),它生成32位和64位DLL。32位DLL为1044 KB,而64位版本为1620 KB。我很好奇为什么这么大。是因为地址太大,还是有一个编译器选项丢失?

    3 回复  |  直到 15 年前
        1
  •  13
  •   Khaled Alshaya    15 年前

    也许您的代码包含很多指针。

    The Free Lunch Is Over

    (旁白: 这里是一则轶事 _空间就是最近击中我的速度__ 编译器团队。编译器使用 32位和 64位编译器;代码只是 编译为32位进程或 64位一位。64位编译器 获得了大量基线 在64位上运行的性能 CPU,主要是因为64位 CPU有更多的寄存器可以工作 具有其他代码性能 特征。一切都很好。但是什么 关于数据? 到64位没有 更改中大多数数据的大小 内存,当然除了指针 尤其是现在的尺寸是现在的两倍 他们以前是。事实上,我们的 编译器使用指针更多 大量的内部数据 结构比大多数其他类型 应用程序。 因为 指针现在是8字节而不是4字节 字节,纯数据大小增加,我们 在 64位编译器的工作集。那 较大的工作集导致 性能惩罚几乎 完全偏移代码执行 性能提高我们从 去更快的处理器 更多的寄存器。在这篇文章中, 64位编译器同时运行 作为32位编译器的速度,甚至 尽管源库对于 和64位处理器都提供 更好的原始处理吞吐量。 空间就是速度。)

        2
  •  3
  •   MSalters    15 年前

    x86-64有更多的寄存器。因此,操作码需要更多的位来指定它们。另外,根据x86的传统,您可以指定寄存器的一部分,现在您有了一个32位的部分寄存器。不使用寄存器的指令很少,因此这些更改几乎影响到每个指令。由于x86-64仍然是一个cisc变量长度is a,这并不意味着每个指令都从32位增长到64位,但有一个确定的增长。

    另一个变化是 movq ,将寄存器设置为常量的操作码需要64位常量(但操作码中的其他常量仍为32位)。

        3
  •  2
  •   swegi    15 年前

    指针大小翻了一番,因此如果代码中有大量指针,可执行文件的增长率可以轻松达到50%。