一、为什么栈访问速度快?堆访问速度慢?
因为栈的内存分配是编译阶段分配的,自动管理,不知道它用了多少栈的容量,都是分配的固定内存,因此不会产生内存碎片,因此访问速度快。
堆则是动态分配的,需要去考虑分配多大的内存,这需要花时间处理,因此容易产生内存碎片(外部碎片和内部碎片),这些碎片会导致内存利用效率下降,增加分配和访问时间,访问速度相对较慢。
二、如何计算栈开销?
通过编译器在生成代码时,会为每个函数创建一个栈帧(stack frame),其中包括局部变量、返回地址、函数参数等信息。使用编译器的调试选项(如 -g
或 -fstack-usage
选项)可以生成栈使用的详细信息,从而分析每个函数的栈开销。