将应用程序从32位移动到64位时,会增加内存使用量吗?
我知道指针的大小会加倍,我怀疑字符串中的字符是“聚集”以更有效地使用内存(所以不会使用更多的内存)。
内存使用量还会增加吗?是否会减少任何地方,或者非算术运算会看到速度效益?
答案 0 :(得分:7)
您可能会看到额外的对齐,以便在这里和那里花费一些额外的字节。由于操作数中的64位常量,代码可能会更大。
至于速度,由于内存使用量增加,您可能会遇到速度减慢。 CPU缓存将更快填满。
我已经看到从x86到x64的显着速度优势,因为x86的寄存器比x64架构少得多。编译器利用额外的寄存器来更好地优化代码。我在相同的硬件上看到了15%的加速。
答案 1 :(得分:3)
正如您所指出的,指针会更大。根据处理器架构,也可能是ints
和/或longs
。字符串应保持相同的大小,但在内存中的排列方式不同,以提高效率。通常,在大多数情况下,64位边界上的数据结构的内存对齐将导致碎片增加。
此外,您的进程地址空间可能会出现(在许多体系结构中),堆栈帧指针出现在高内存中(并且向下增长)要大得多,但由于它们总是虚拟内存指针,因此应用程序使用的实际物理内存是通常要小得多。
答案 2 :(得分:2)
在某些情况下,您可能会节省内存。实际代码可能在某些地方更短,因为由于寄存器数量的增加,需要更少的加载/存储。默认调用约定传递寄存器中的参数,例如。
总的来说,64位应用程序可能比32位应用程序使用一点更多内存。但它不会成为一个交易破坏者。
答案 3 :(得分:2)
根据架构,代码也可以增长。全局变量和常量通常通过绝对地址(由程序加载程序重定位)引用,这些引用在64位模式下为64位。在x64上有一个64位常量的显式mov指令,因此程序只会增加常量的大小。跳转和调用指令也可能变大,但这取决于编译器和链接器的许多参数。在其他架构上,它甚至可能更糟。例如,在SPARC上,从32位到64位可以使代码显着增长。由于sparc没有可以加载超过22位的指令,当加载全局变量或常量的32位地址时,它需要2条指令,要加载64位常数,它甚至需要5条指令和3个寄存器。通过增加寄存器压力,编译器经常错过优化机会,使代码比必要的大得多。