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

时间:2009-10-19 16:33:36

标签: c++ 64-bit visual-c++

我有一个VC ++项目(2005),它可以生成32位和64位dll。 32位dll是1044 KB,而64位版本是1620 KB。我很好奇为什么尺寸这么大。是因为地址大小较大,还是我缺少编译器选项?

3 个答案:

答案 0 :(得分:13)

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

  

The Free Lunch Is Over

     

....

     

(除了:   这是一个演示的轶事   “太空是速度”,最近袭击了我的   编译团队。编译器使用   32位和32位的相同源代码库   64位编译器;代码就是   编译为32位进程或   一个64位的。 64位编译器   获得了大量的基线   通过在64位上运行来实现性能   CPU,主要是因为64位   CPU有更多的寄存器可以工作   有和其他代码性能   特征。一切都很好。但是什么   关于数据? 64位没有   更改中大部分数据的大小   内存,当然除了指针   特别是现在的两倍大小   他们以前。碰巧,我们的   编译器更多地使用指针   内部数据   结构比其他大多数   应用程序永远都会。因为   指针现在是8个字节而不是4个字节   字节,纯数据大小增加,我们   看到了显着增加   64位编译器的工作集。那   更大的工作集导致了   性能惩罚差不多   完全抵消代码执行   性能提升我们从中获益   用更快的处理器去   更多寄存器。截至撰写本文时,   64位编译器运行相同   速度如同32位编译器,甚至   虽然源库是相同的   两者和64位处理器提供   更好的原始处理吞吐量   空间就是速度。)

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

你的指针大小增加了一倍,所以如果代码中有很多指针,你的可执行文件可以轻松增长50%。

相关问题