什么时候变量的空间在堆栈上分配?

Xai*_*oft 0 c#

在声明或初始化期间分配空间:

int c; // here

c = 5; // or here
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 12

什么时候变量的空间在堆栈上分配?

您的问题预先假定变量的存储在堆栈上分配.它不一定是.你刚才说"int a;" 不指示那是局部变量还是字段,并且没有指示其他重要信息,例如局部变量是否是匿名函数的封闭本地,或者块是否是迭代器块.在许多情况下,变量不会消耗堆栈空间,因为变量不是短暂的.

假设为了参数,变量是一个短命的局部变量.它仍然可能不在堆栈中.它可能已被注册,特别是如果抖动知道它位于具有大量未使用寄存器的架构上.

假设为了参数,变量是一个短暂的局部变量,并且抖动没有选择注册它,何时分配堆栈空间?

好吧,再次,你假设抖动使用堆栈作为临时池; 虽然这是一种方便的数据结构,但抖动允许宽幅度.临时池可以从堆中分配,也可以有多个堆栈; 一些体系结构支持将数据堆栈与调用堆栈分离,以防止堆栈粉碎攻击.

假设变量是一个短暂的局部变量,并且抖动选择不注册它并且临时池在调用堆栈上,它何时被分配的堆栈空间?

那么现在它取决于你所说的"分配".整个百万字节的堆栈在虚拟内存系统中保留并积极提交,因此答案是"一旦创建了线程,就会分配此线程中堆栈中所有内容的堆栈空间,并保留分配".当然它在页面文件中保持分配状态.在页面错误从磁盘上的页面文件中引入之前,该堆栈不会移动到硬件(RAM)中.

如果您要问的是"何时堆栈指针被撞到,以便有特定的堆栈空间可用于此局部变量",那么答案通常是"一旦控制进入方法".这样做当然可以触发我刚才提到的页面错误.

我很想知道你为什么关心.它有什么不同?