Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables gcc如何将局部变量推送到堆栈上?_Variables_Gcc_Stack_Allocation - Fatal编程技术网

Variables gcc如何将局部变量推送到堆栈上?

Variables gcc如何将局部变量推送到堆栈上?,variables,gcc,stack,allocation,Variables,Gcc,Stack,Allocation,我发现这些局部变量(例如本例)并没有按顺序推送到堆栈中。b和c按其声明的顺序推送,但a和d被分组在一起。因此,编译器分配数组的方式不同于任何其他内置类型或对象 这是C/C++要求还是gcc实现细节?C标准没有说明局部变量的分配顺序。它甚至不使用单词stack。它只要求局部变量的生存期从最近的封闭块的入口开始,基本上是在执行到达{时,并在从该块退出到达}时结束,并且每个对象都有一个唯一的地址。它确实承认,由于涉及指针运算的模糊技术原因,两个不相关的变量可能碰巧在内存中相邻,但没有说明何时会发生这种

我发现这些局部变量(例如本例)并没有按顺序推送到堆栈中。b和c按其声明的顺序推送,但a和d被分组在一起。因此,编译器分配数组的方式不同于任何其他内置类型或对象


这是C/C++要求还是gcc实现细节?

C标准没有说明局部变量的分配顺序。它甚至不使用单词stack。它只要求局部变量的生存期从最近的封闭块的入口开始,基本上是在执行到达{时,并在从该块退出到达}时结束,并且每个对象都有一个唯一的地址。它确实承认,由于涉及指针运算的模糊技术原因,两个不相关的变量可能碰巧在内存中相邻,但没有说明何时会发生这种情况

变量的分配顺序完全取决于编译器的突发奇想,您不应该编写依赖于任何特定顺序的代码。编译器可能会按照声明局部变量的顺序或按名称的字母顺序排列它们,或者可能会将一些变量组合在一起,如果这碰巧会导致更快的代码

如果需要按特定顺序分配变量,可以将它们包装在数组或结构中

如果您查看生成的机器代码,您很可能会发现变量没有逐个推送到堆栈上。相反,编译器可能会生成一条指令,将堆栈指针调整一定数量的字节,从而有效地分配一块内存来保存函数或块的所有局部变量。访问给定变量的代码将在堆栈帧内使用其偏移量


由于函数不处理局部变量,编译器可能根本不会为它们分配空间,特别是当您请求使用-O3或类似的优化时。

C标准没有说明局部变量的分配顺序。它甚至不使用单词stack。它只要求局部变量的生存期从最近的封闭块的入口开始,基本上是在执行到达{时,并在从该块退出到达}时结束,并且每个对象都有一个唯一的地址。它确实承认,由于涉及指针运算的模糊技术原因,两个不相关的变量可能碰巧在内存中相邻,但没有说明何时会发生这种情况

变量的分配顺序完全取决于编译器的突发奇想,您不应该编写依赖于任何特定顺序的代码。编译器可能会按照声明局部变量的顺序或按名称的字母顺序排列它们,或者可能会将一些变量组合在一起,如果这碰巧会导致更快的代码

如果需要按特定顺序分配变量,可以将它们包装在数组或结构中

如果您查看生成的机器代码,您很可能会发现变量没有逐个推送到堆栈上。相反,编译器可能会生成一条指令,将堆栈指针调整一定数量的字节,从而有效地分配一块内存来保存函数或块的所有局部变量。访问给定变量的代码将在堆栈帧内使用其偏移量


由于您的函数对其局部变量不做任何处理,编译器可能根本不会为它们分配空间,特别是当您请求使用-O3或类似的优化时。

编译器可以按自己的意愿对局部变量进行排序。它甚至可以选择根本不分配它们(例如,如果它们未被使用),或者通过传播/加密/保留在寄存器中/等进行优化,或者为具有不相交活动范围的多个局部变量分配相同的堆栈位置

没有通用的实现细节来概括特定编译器是如何实现的,因为它可能随时发生变化

通常,编译器会尝试将大小相似的变量和/或对齐组合在一起,以最大限度地减少通过间隙浪费的空间,但还涉及到许多其他因素


结构和数组的要求略有不同,但我认为这超出了这个问题的范围。

编译器可以按照自己的意愿对局部变量进行排序。它甚至可以选择根本不分配它们(例如,如果它们未被使用),或者通过传播/加密/保留在寄存器中/等进行优化,或者为具有不相交活动范围的多个局部变量分配相同的堆栈位置

没有通用的实现细节来概括特定编译器是如何实现的,因为它可能随时发生变化

典型的 实际上,编译器将尝试将大小相似的变量和/或对齐组合在一起,以最大限度地减少通过间隙浪费的空间,但还涉及许多其他因素

结构和数组的要求略有不同,但我认为这超出了这个问题的范围

void
f
    ()
{
    int a[1];
    int b;
    int c;
    int d[1];
}