1. 栈分配是否会隐式调用malloc/free函数?如果没有,它如何确保栈分配和堆分配之间没有冲突?
2. 如果是; C++中的栈分配是否隐式调用new/delete?如果是,则为类重载new运算符是否会影响其栈分配?
在VC++中,这产生了令人困惑的结果;但由于VC++并非完全符合标准(或者我听说过),因此我决定在这里提出问题...
堆栈分配不使用malloc/free之类的东西。它使用一块内存,被称为程序堆栈,它只是一段连续的内存。
有一个特殊的寄存器存储着堆栈的顶部。当在堆栈上创建新对象时,顶部会上升,从而增加堆栈的大小;当一个对象被释放(超出范围)时,顶部会下降,从而减小堆栈的大小。
如果您试图在堆栈上分配一个过大的对象或进入递归太深,那么堆栈的顶部将超过允许的最大大小,这就是所谓的堆栈溢出。
注意: 堆栈增长的实际方向(地址递增或递减)因系统而异,但无论实际方向如何,基本思想都是相同的。
ALLOC(size, T) alloc((char[size*sizeof(T)]{0x00}))
void *
alloc(char * obj) {
return (void *)obj;
}
- UserX对于你的第一个问题,答案是否定的。栈根本不是从堆中分配的。
首先应该阅读什么是栈和堆,它们位于哪里来了解基本概念。
这里有一个很好的问题:
"它如何确保堆栈分配和堆分配之间没有冲突?"
几乎所有C/C++实现都有单一连续地址空间,因此堆栈和堆分配的内存必须在该空间中共存。
虽然每次堆栈增长和收缩时并不是使用单独的堆分配完成的,但你仍然可以将堆栈视为从堆中分配的单个大块内存。如果堆栈超出了该块的边界,则会发生堆栈溢出(一个引人注目的名称...有人应该以此命名一个网站)。
在多线程程序中,每次线程启动时都必须为其分配新的堆栈,并且当线程死亡时,堆栈可以被释放。对于那些整个堆栈块,使用与malloc
/free
相同的堆管理进行分配是有意义的。
因此-粗略地说-您可以将堆栈视为一种在堆中共存的对象类型。整个堆栈在线程启动时一次性用malloc
分配,然后从其中进行子分配,最后一次性free
。