关于C / C ++堆栈分配
在学习C ++(和C)时,我对堆栈分配的工作有一些特别的怀疑,我找不到解决方案:
隐式堆栈分配调用malloc / free函数吗? 如果不; 它如何确保堆栈分配和堆分配之间没有冲突?
如是; C ++中的堆栈分配是否隐式调用new / delete? 如是; 为一个类重载新运算符是否会影响其堆栈分配?
它在VC ++中产生了令人困惑的结果; 但由于VC ++不完全符合标准(或者我听说过),所以我决定最好在这里问问...
堆栈分配不使用像malloc / free这样的任何东西。 它使用一段称为程序堆栈的内存,它只是一段连续的内存。
有一个特殊的寄存器存储堆栈的顶部。 当在堆栈上创建新对象时,顶部被抬起,从而增加堆栈,当一个对象被释放(超出范围)时,顶部被降低,从而减少堆栈。
如果你尝试在堆栈上分配一个太大的对象,或者太深入到递归中,那么顶端将会超过堆栈的最大允许大小,这被称为堆栈溢出。
注意:堆栈增长的实际方向(地址增加或减少)会因系统而异,但不管实际的方向如何,总体思路是相同的。
您的第一个问题的答案是否。堆栈根本不是从堆中分配的。
你应该先阅读什么和堆栈和堆在哪里以理解基本概念。
堆栈分配通常以alloca()方式或由编译器隐式地完成。 一个完成的alloca()只需要很少的指令,并且完成后没有成本(甚至是需要)来释放它。
你可以传递一个指向由alloca()分配的内存的指针给任何其他需要指针的函数/方法。 你绝不能返回由alloca()分配的指针。
以下是使用堆栈分配的一些优点和缺点。
链接地址: http://www.djcxy.com/p/82797.html