为什么64位程序文件比32位大?

5

64位编译的文件比32位可执行文件大约多20%。我认为64位操作系统与32位操作系统也是如此。感谢上帝,这个比率不是50%。这20%真的有必要吗?64位程序是否会消耗更多的RAM?128位会更大吗?

补充: 我知道32位单词和64位单词。字符“A”在32位模式下需要4个字节,在64位模式下需要8个字节的内存。可执行文件包含大量常量,这些常量对齐/填充,因此在64位形式下更大吗?依我之见,64位exe和32位exe之间的差异在于指令代码 - 我认为它们不会太多地增加文件大小 - 以及静态数据和内存地址。如果是这样,那么一个exe包含的静态数据比我想象的要多得多。这有点像PNG8 vs PNG24。或者我完全错了。


大多数实现在内存地址上使用64位(8字节)。 如果您不喜欢更大的编译空间,您将不得不放弃使用超过4GB的RAM。 - user684934
1
你可能想阅读这个链接:http://en.wikipedia.org/wiki/64-bit - mtijn
澄清一下,以便您在答案中添加。 - Paul Cantrell
2个回答

8
根据ISA(Intel,ARM等)的不同,各种指令需要按字对齐(这可能导致它们占用更多的空间),并且数字常量需要与处理器的字长匹配。二进制代码中充满了int常量:循环从零开始等。简而言之,额外空间的可能原因是int填充和常量数据的字对齐。
根据编译方式的不同,64位代码可能会使用更多内存。数据结构也希望进行字对齐以实现快速访问,并且编译器可能会选择填充结构体。此外,某些int常量的大小可能会因编译器而异。(这就是为什么您总是看到像uint32这样的typedefs:保证大小。)
最后但并非最不重要的是,指针需要两倍的内存。

2

编写64位程序的一个原因是能够使用更多的RAM。这需要在地址中使用8个字节,而不是32位程序中的4个字节。这可能会增加程序的大小。

另一方面,如果您的程序处理本质上是64位的数据,则可以使用单个指令完成操作,而32位程序则需要使用两个指令。这将使程序更小、更快。

字符'A'在任何情况下都只使用一个字节,所以这并不重要。


这是主要部分。一个次要的部分是,常见的32位整数操作突然需要稍微长一些的操作码(因为默认的是64位),反之亦然。 - Marco van de Voort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接