Pet*_*etr 44 c memory memory-management computer-architecture
从我迄今为止发现的内容可以清楚地看出,针对64位架构编译的程序使用的内存量是其32位替代品的两倍 - https://superuser.com/questions/56540/32-bit-vs- 64位系统.
这是否意味着为64位编译的代码平均使用的RAM是32位版本的两倍?
我不知何故怀疑它,但我想知道真正的开销是什么.我想,小类型,如short
,byte
与char
相同大小的64位架构?我不是很确定byte
.鉴于许多应用程序使用大型字符串(如Web浏览器等),char
在大多数实现中主要由数组组成,因此开销可能不会太大.
因此,即使数字类型在64位上更大int
且long
更大,是否会对RAM的使用产生重大影响?
glg*_*lgl 42
这取决于编程风格(和语言,但你指的是C).
double
或者int32_t
,RAM消耗不会增加.int
或类型long
,它取决于架构; Linux和Windows之间可能存在差异.在这里,您可以看到您的替代品.简而言之,Windows使用LLP64,这意味着long long
指针是64位,而Linux使用LP64,其中long
64位也是如此.其他架构可能会制造int
甚至short
64位,但这些都非常罕见.float
并且double
在所有情况下都应保持相同的大小.所以你看它很大程度上取决于数据类型的用法.
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++.