c语言队列在堆区还是栈区(CC入门之堆和栈)(1)

很多时候,你会被问到,也许是在面试的时候,堆和栈有什么区别?什么时候变量被分配到堆中?什么时候被分配到栈中?不是提问者故意刁难,也不是这样问,就显得自己有多么高大上。作为一个码农,不知道答案也许没关系,但这样一来,你也就未必真的了解自己的代码。

堆和栈,都是机器的一块内存区域。区别是,两者的用途和访问速度都不一样。栈直接参与系统调用,作为存放临时数据的地方,它的地址是放在专门的寄存器中的。这些寄存器,就是CPU直接访问的地方。这样一来,栈存取速度特别快,但能支持的数据类型,就非常有限,仅限于整数,指针,浮点数等系统直接支持的数据类型。涉及到函数调用的时候,系统先把函数返回地址入栈,然后依次放入函数局部变量。执行完后依次出栈,最后是函数返回地址。这种方式,直接决定了函数局部变量的生命周期。

这里,类变量b,c以及函数f里的int变量a,都是局部变量,放在栈中。其中,b和c的地址是连续的,正好相差32个字节。类变量d通过new关键字分配内存,所以它的起始地址就跟b和c不一样(我的环境里是25769945744),虽然也是局部变量,但是是放在堆中的。这里注意,两个局部变量a的地址是完全一样,虽然是通过不同的函数调用来定义。这也正好体现了栈的特点:栈自动分配和释放内存;栈内存可迅速重用。

,