什么是64位应用程序的内存使用开销?
从我迄今为止发现的情况来看,很明显,针对64位体系结构编译的程序使用的指针的内存是其32位替代方法的两倍 – https://superuser.com/questions/56540/32-bit-vs- 64位系统 。
这是否意味着为64位编译的代码平均使用比32位版本多两倍的内存 ?
我怀疑它,但我想知道真正的开销是什么。 我想在64位体系结构中,像short
, byte
和char
这样的小types是相同的? 虽然我不太确定byte
。 鉴于许多应用程序都使用大型string(如Web浏览器等),大多数实现中都由char
数组组成,所以开销可能不会那么大。
所以,即使像int
和long
这样的数字types在64位上更大,是否会对RAM的使用有重要影响?
这取决于编程风格(和语言,但你指的是C)。
- 如果你用指针工作了很多(或者你在某些语言中有很多引用),RAM消耗就会增加。
- 如果你使用大量的固定大小的数据,比如
double
或int32_t
,那么RAM消耗就不会增加。 - 对于像
int
或long
这样的types,这取决于体系结构; Linux和Windows可能有区别。 在这里你可以看到你的select。 简而言之,Windows使用LLP64,这意味着long long
和指针是64位,而Linux使用LP64,long
也是64位。 其他体系结构可能会使int
或甚至short
64位,但这些是非常罕见的。 -
float
和double
在所有情况下都应该保持相同的大小。
所以你看它强烈依赖于数据types的使用。
内存消耗有一些上升的原因。 然而,64b与32b的开销依赖于应用程序到另一个应用程序。
-
主要的原因是在你的代码中使用了很多指针 。 但是,编译为64位并在64位操作系统上运行的代码中dynamic分配的数组的大小与在32位系统上分配的数组的大小相同。 只有数组的地址会更大,内容大小将会相同( 除非types大小发生了变化 – 但是这种情况不应该发生,应该logging在案)。
-
另一个足迹增加将由于内存alignment 。 在64位模式下,alignment需要考虑一个64位地址,以便增加一个小的开销。
-
代码的大小可能会增加 。 在一些架构上,64位ISA可能稍微大些。 另外,你现在必须拨打64位地址。
-
当在64位寄存器中运行时 (64位) 更大,所以如果你使用许多数字types,编译器可能会把它们放在寄存器中,所以这不一定意味着你的RAM占用空间会增加。 如果没有存储到64b寄存器中,则使用双variables可能会产生内存占用增加。
-
当使用JIT编译语言(如Java,.NET)时,由于运行时环境将通过指针使用,隐藏的控制结构等产生额外开销,64b代码的占用空间增加可能会更大。
但是没有描述64位内存占用开销的幻数。 这需要从应用程序到另一个应用程序进行衡量。 从我看到的情况来看,与32位版本相比,64位版本的应用程序的占用空间不会超过20% 。 但是,这纯粹是基于我遇到的应用程序,我主要使用C和C ++。
我想可能还有另外一个原因,那就是variables需要存储在一个64位边界的内存中,这个地址是… xxxxx000,可以一口读出来,如果不是需要读一个字节的话一次。