从我迄今为止发现的内容可以清楚地看出,针对64位架构编译的程序使用的内存量是其32位替代品的两倍 - https://superuser.com/questions/56540/32-bit-vs-64-bit-systems。
这是否意味着为64位编译的代码平均使用的RAM是32位版本的两倍?
我不知何故怀疑它,但我想知道真正的开销是多少。我认为像short
,byte
和char
这样的小类型在64位架构中大小相同吗?我不是很确定byte
。鉴于许多应用程序使用大型字符串(如Web浏览器等),在大多数实现中主要由char
数组组成,开销可能不会太大。
因此即使像int
和long
这样的数字类型在64位上更大,它是否会对RAM的使用产生重大影响?
答案 0 :(得分:42)
这取决于编程风格(和语言,但你指的是C)。
double
或int32_t
,则RAM消耗量不会增加。int
或long
等类型,它取决于架构; Linux和Windows之间可能存在差异。 Here你看到了你的替代品。简而言之,Windows使用LLP64,意味着long long
和指针是64位,而Linux使用LP64,其中long
也是64位。其他架构也可能使int
甚至short
64位,但这些都非常罕见。float
和double
的大小应保持不变。所以你看它很大程度上取决于数据类型的用法。
答案 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只需一口读取,如果它不需要读取它一次一个字节。