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

What is the memory usage overhead for a 64-bit application?

根据我目前的发现,很明显,为 64 位架构编译的程序使用的指针 RAM 是其 32 位替代方案的两倍 - https://superuser.com/questions/56540/32-bit-vs-64-bit-systems.

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

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

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

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

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

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

内存消耗增加有几个原因。然而,64b 与 32b 的开销因应用程序而异。

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

  • 另一个占用空间增加是由于内存对齐。在 64 位模式对齐需要考虑 64 位地址,以便 应该增加一点开销。

  • 代码的大小可能会增加。一些 64 位 ISA 的体系结构可能会稍大一些。还有,你会 现在必须调用 64 位地址。

  • 当运行 在64位寄存器中较大(64位)所以如果你使用 许多数值类型,编译器不妨将它们放在 注册所以这不一定意味着你的 RAM 足迹 会上升。 使用double变量很可能会产生记忆 如果不将它们存储到 64b 寄存器中,占用空间会增加。

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

然而,没有描述 64 位内存占用开销的神奇数字。这需要从一个应用程序到另一个应用程序进行衡量。据我所知,与 32 位相比,64 位应用程序 运行 的占用空间增加从未超过 20%。然而,这完全基于我遇到的应用程序,我主要使用 C 和 C++。

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