我知道在C++中有三个内存区域:堆栈、堆和为静态分配特性而分配的区域。我有两个问题:
为什么堆比栈慢得多?它应该只是一个额外的间接层吗?
为静态“特性”(变量、函数、类)分配的内存区域是否比堆提供更快的性能?
我知道在C++中有三个内存区域:堆栈、堆和为静态分配特性而分配的区域。我有两个问题:
为什么堆比栈慢得多?它应该只是一个额外的间接层吗?
为静态“特性”(变量、函数、类)分配的内存区域是否比堆提供更快的性能?
1) 为什么堆比栈慢得多?它只是一个额外的间接层,不应该太慢吧?
因为在栈上分配内存意味着将堆栈指针sp 增加1 N 个字节。以这种方式更改sp 足够快。对于堆,则需要执行许多操作,例如查找空闲插槽或请求操作系统获得内存,这些都是昂贵的操作。
1.或减少,取决于栈的增长方向!
2) 分配给静态“特征”(变量,函数,类)的内存区域能够提供比堆更快的性能吗?
如果您指的是static
变量,则是的,它们比堆更快,因为它们是静态分配的,并且存在于程序结束之前。但是,在此上下文中不能比较为函数分配的内存(问题对我来说不完全有意义)。
1) 这不是间接性问题,而是内存管理的问题。在堆栈上分配内存只涉及将堆栈指针向上移动。而在堆上分配则需要寻找正确大小的内存段,并考虑碎片。
2) 静态内存在程序进入主入口点之前被分配,因此没有真正的运行时开销。对已经分配的内存的访问速度实际上并不取决于内存分配的位置。
栈比堆快得多的一个原因是由于局部性原理。存储在栈中的数据位于连续位置,这意味着如果引用一个变量,则其相邻信息会自动带入缓存。存储在堆上的数据(除了动态数组)没有这个优势。