64位应用程序的内存使用开销是多少?

Pet*_*etr 44 c memory memory-management computer-architecture

从我迄今为止发现的内容可以清楚地看出,针对64位架构编译的程序使用的内存量是其32位替代品的两倍 - https://superuser.com/questions/56540/32-bit-vs- 64位系统.

这是否意味着为64位编译的代码平均使用的RAM是32位版本的两倍?

我不知何故怀疑它,但我想知道真正的开销是什么.我想,小类型,如short,bytechar相同大小的64位架构?我不是很确定byte.鉴于许多应用程序使用大型字符串(如Web浏览器等),char在大多数实现中主要由数组组成,因此开销可能不会太大.

因此,即使数字类型在64位上更大intlong更大,是否会对RAM的使用产生重大影响?

glg*_*lgl 42

这取决于编程风格(和语言,但你指的是C).

  • 如果您使用指针工作很多(或者在某些语言中有很多引用),则RAM消耗会增加.
  • 如果使用大量固定大小的数据,例如double或者int32_t,RAM消耗不会增加.
  • 对于类型int或类型long,它取决于架构; Linux和Windows之间可能存在差异.在这里,您可以看到您的替代品.简而言之,Windows使用LLP64,这意味着long long指针是64位,而Linux使用LP64,其中long64位也是如此.其他架构可能会制造int甚至short64位,但这些都非常罕见.
  • float并且double在所有情况下都应保持相同的大小.

所以你看它很大程度上取决于数据类型的用法.

  • @DavidGrinberg由于[压缩oops](http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#compressedOop),Java程序使用不到~4GiB的堆可能会保持不变. (2认同)

VAn*_*rei 25

内存消耗上升的原因有几个.然而,64b对32b的开销取决于应用程序到另一个应用程序.

  • 主要原因是在代码中使用了很多指针.但是,在为64位编译并在64位操作系统上运行的代码中动态分配的数组与在32位系统上分配的数组大小相同.只有数组的地址会更大,内容大小将相同(除非类型大小发生变化 - 但这不应该发生,应该有详细记录).

  • 另一个足迹增加是由于内存对齐.在64位模式下,对齐需要考虑64位地址,因此应该增加一小部分开销.

  • 可能代码大小会增加.在某些架构上,64位ISA可能略大一些.此外,您现在必须拨打64位地址.

  • 在64位寄存器中运行较大(64位)时,如果你使用许多数字类型,编译器也可以将它们放在寄存器中,这样就不一定意味着你的RAM占用空间会增加.如果没有存储到64b寄存器中,使用双变量可能会增加内存占用量.

  • 当使用JIT编译语言(如Java,.NET)时,64b代码的占用空间增加可能会更大,因为运行时环境将通过指针使用,隐藏控制结构等产生额外开销.

但是,没有描述64位内存占用开销的幻数.这需要从应用程序到另一个应用程序进行测量.从我看到的情况来看,与32位相比,64位运行的应用程序的占用空间从未增加超过20%.然而,这完全基于我遇到的应用程序,而且我主要使用的是C和C++.