C++中的内存分配区域(堆栈与堆与静态)

use*_*112 9 c++ linux x86

我知道C++中有三个而不是两个内存区域:堆栈,堆和静态分配功能的区域.我有两个问题

  1. 为什么堆比堆栈慢得多?当然它应该只是一个额外的间接水平?

  2. 为静态"特性"(变量,函数,类)分配的内存区域是否提供比堆更快的性能?

Dav*_*men 12

首先是几个旁注.正确的术语是自动的而不是堆栈,动态而不是堆.另一个是使用C++ 11,现在有四种而不是三种类型的内存.C++ 11为混合添加了线程本地内存.

自动内存很快,因为它是在大多数机器上使用调用堆栈实现的.所需要的是调整堆栈指针正确的数量和瞧!内存已分配.动态内存需要更多的工作.必要的内存可能没有附加到进程,并且要实现这一点需要通过操作系统.即使内存可用,动态内存管理工具仍然必须找到它并将其标记为正在使用中.

静态存储器被"分配"为编译和链接过程的一部分.在某个源文件中定义静态变量时,编译的代码包含链接器为该变量保留空间的特殊指令.编译器还将您的C/C++代码转换为机器代码.链接器组合了所有这些不同的数据块和代码,并解析地址以形成可执行的二进制映像.运行程序时,该二进制映像将加载到(虚拟)内存中.程序开始执行后,该静态变量的内存就会存在.

就性能而言,最好不要过早担心性能问题.虽然静态内存很快,但存在许多缺点.你要做的最后一件事是让你的所有数据都是静态的.