Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 64位应用程序的内存使用开销是多少?_C_Memory_Memory Management_Computer Architecture - Fatal编程技术网

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

C 64位应用程序的内存使用开销是多少?,c,memory,memory-management,computer-architecture,C,Memory,Memory Management,Computer Architecture,从我目前发现的情况来看,很明显,为64位体系结构编译的程序使用的指针RAM是32位替代方案的两倍 这是否意味着为64位编译的代码的平均使用量是32位版本的两倍 我有点怀疑,但我想知道真正的开销是什么。我假设小类型,如short、byte和char在64位体系结构中大小相同?不过,我对字节不太确定。考虑到许多应用程序使用大型字符串(如web浏览器等),在大多数实现中,这些字符串主要由char数组组成,因此开销可能不会太大 因此,即使像int和long这样的数字类型在64位上更大,它是否会对RAM的

从我目前发现的情况来看,很明显,为64位体系结构编译的程序使用的指针RAM是32位替代方案的两倍

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

我有点怀疑,但我想知道真正的开销是什么。我假设小类型,如
short
byte
char
在64位体系结构中大小相同?不过,我对字节不太确定。考虑到许多应用程序使用大型字符串(如web浏览器等),在大多数实现中,这些字符串主要由
char
数组组成,因此开销可能不会太大


因此,即使像
int
long
这样的数字类型在64位上更大,它是否会对RAM的使用产生显著影响?

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

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

因此,您可以看到它在很大程度上取决于数据类型的使用。

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

  • 主要原因是在代码中使用了大量指针。但是, 在为64位编译并运行的代码中动态分配的数组 64位操作系统上的数组大小与32位操作系统上分配的数组大小相同 位系统。只有数组的地址会更大,内容 大小将相同(但类型大小更改时除外) 这不应该发生,并且应该有很好的记录)

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

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

  • 在64位寄存器中运行时,寄存器会更大(64位),因此如果使用 编译器还可以将它们放在许多数字类型中 寄存器,所以这不一定意味着您的RAM占用空间 会上升使用双变量可能会产生内存 如果它们未存储到64b寄存器中,则占用空间会增加

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


但是,没有神奇的数字来描述64位内存占用开销。这需要从一个应用程序到另一个应用程序进行度量。从我所看到的,对于运行在64位上的应用程序,我从未获得超过20%的占用空间增长,而不是32位。然而,这纯粹是基于我遇到的应用程序,我主要使用C和C++。

< P>我认为可能还有另一个原因,原因是变量需要存储在64位边界上的内存中。如果不是,则需要一次读取一个字节。

byte
不是标准类型。对于C99或更高版本,如果需要无符号8位“字节”,请包括
,然后使用
uint8\u t
。内存使用量将增加,但(几乎)永远不会增加一倍。创建具有更宽地址和数据总线的新CPU的全部目的是以牺牲程序大小和RAM消耗为代价来提高执行速度。从8岁到16岁,从32岁到64岁,情况一直如此。所以这里没有什么新鲜事。@Lundin我意识到这会导致开销,但我想知道的是开销有多大。当然,有些系统可能需要针对RAM消耗而不是CPU消耗进行优化。RAM不重要,64位程序使用处理器缓存的效率要低得多。还不到两倍坏,这取决于发生了什么。出于这个原因,int仍然是32位。由于AMD的功劳,他们确实通过添加所有正确的功能来补偿性能损失,以获得可比的结果。从额外的8个寄存器开始。跳转通常是相对32位的。您不能使用单个jmp指令跳转到绝对64位地址唯一具有64位立即数的指令是movabs,因此您不能在64位立即数地址调用函数。我很确定您可以调用64b绝对地址。检查这里:根据相同的参考,64位偏移的跳转也是可能的。你误读了一些东西。“在64位模式下,立即数和位移通常只有32位宽。因此,NASM会将大多数位移和立即数截断为32位。唯一采用完整64位立即数的指令是:MOV reg64,imm64”x86-64还具有使用32位指针的x32 ABI。与使用32位x86相比,它的优势在于具有更面向寄存器的呼叫约定,并且能够使用额外的8 GPRs(和addit)