Roo*_*149 1 c memory struct loops conditional-statements
这个问题可能听起来微不足道但是,我知道每当一个函数开始执行时,堆栈中就会为函数的所有局部变量等创建堆栈帧,但是我无法理解当for循环开始执行或者内部的代码时会发生什么.如果条件开始执行.将它们视为在函数的堆栈框架内执行似乎是不合理的,因为它们有自己的范围,因此它们有自己的局部变量.但是,它们可以访问它们上面的函数的变量,因此这似乎意味着它们位于函数的堆栈框架内.
所以有人可以为我清楚这一点吗?
它们在被执行时实际位于内存中的哪个位置?
同样的问题出现在结构上,它们有自己的范围,它们不是指针,而只是更大的"盒子",包含整数,字符*等.
循环(或任何其他类似块的构造,例如if-else语句)与函数不相似.函数是一个自治实体.它本身就是一个完整的计算.当你调用一个函数时,函数的指令,语句和表达式只能访问 - 除了全局变量 - 函数的局部变量和参数(诀窍是参数可以绑定到调用函数的本地变量,它们的地址等) .
但是,循环,if-else或任何其他类型的块是函数的一部分.它不是一个单独的计算单位.它们不是"被称为".它们只是被触及并执行.
块具有范围的事实并不意味着它们需要单独的堆栈帧.输入新范围时,不会创建堆栈框架.调用函数时会创建堆栈帧,因为堆栈与控制流管理有关(例如,帧也需要保存函数的返回地址).
是的,嵌套作用域中变量的分配和销毁可以用堆栈表示,但这不是调用堆栈.这相当于某种"范围堆栈",它纯粹是概念性的.让我用一个例子来证明这一点:
void foo()
{
int a = 42; // 'a' is declared and is in scope.
// Let's pretend its address is 0x1000.
{
int b = 1337; // 'b' is declared and in scope.
// Let's pretend its address is 0x1004.
}
// here, 'b' is destroyed. Nothing is "popped" out of the stack
// at runtime – it's merely that the compiler can detect that the
// name 'b' is not in scope anymore. And hence:
int c = 0; // it may now reuse the former address of 'b', 0x1004,
// for storing 'c'.
// Each of these 3 variables reside within the same stack frame.
}
Run Code Online (Sandbox Code Playgroud)
至于结构:这又是完全不同的东西.如果声明一个struct类型的变量,那么将分配足够大的内存块来按顺序保存结构的所有成员.记忆方面,"没有结构".结构中只有一个成员,一个一个地分配,正确对齐.A struct只是一种抽象.