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

时间:2015-03-19 08:21:38

标签: c memory memory-management computer-architecture

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

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

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

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

3 个答案:

答案 0 :(得分:42)

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

  • 如果您使用指针工作很多(或者您在某些语言中有很多引用),则RAM消耗会增加。
  • 如果您使用大量固定大小的数据,例如doubleint32_t,则RAM消耗量不会增加。
  • 对于intlong等类型,它取决于架构; Linux和Windows之间可能存在差异。 Here你看到了你的替代品。简而言之,Windows使用LLP64,意味着long long和指针是64位,而Linux使用LP64,其中long也是64位。其他架构也可能使int甚至short 64位,但这些都非常罕见。
  • 在所有情况下,
  • floatdouble的大小应保持不变。

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

答案 1 :(得分:24)

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

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

  • 另一个足迹增加是由于内存对齐。在 64位模式的对齐需要考虑64位地址 应该增加一点开销。

  • 代码的大小可能会增加。一些 体系结构64位ISA可能略大一些。而且,你会的 现在必须拨打64位地址。

  • 在64位寄存器中运行较大(64位)时,如果您使用 编译器可能会将许多数字类型放入其中 寄存器,这不一定意味着你的RAM足迹 会上升。 使用双变量可能会产生内存 如果它们没有存储到64b寄存器中,则占用空间增加。

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

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

答案 2 :(得分:0)

我认为可能有另一个原因可以追溯到变量需要存储在64位边界的内存中,地址是... xxxxx000只需一口读取,如果它不需要读取它一次一个字节。