gcc在更改变量声明顺序后保留内存分配

B. *_*tas 5 c gcc

我有这种形式的功能:

void authenticate()
{
    int auth_flag;
    char password[16];
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我调试程序时,我可以看到auth_flag变量位于堆栈中的密码变量之后(看起来很正常).

现在当我改变变量声明的顺序时:

void authenticate()
{
    char password[16];
    int auth_flag;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我看到变量auth_flag仍然在堆栈中的密码变量之后分配.

我正在寻找的是任何避免/控制它的方法,无论是使用编译选项还是使用代码内编译器指令.

小智 4

根据GCC 文档“通用函数属性”

  • no_reorder

不要no_reorder对彼此标记的函数或变量或可执行文件的顶级汇编程序语句进行重新排序。程序中的实际顺序将取决于链接器命令行。像这样标记的静态变量也不会被删除。这与该选项具有类似的效果-fno-toplevel-reorder,但仅适用于标记的符号。

“优化选项”中:

  • -fno-toplevel-reorder

不要重新排序顶级函数、变量和 asm 语句。按照它们在输入文件中出现的顺序输出它们。使用此选项时,不会删除未引用的静态变量。此选项旨在支持依赖于特定顺序的现有代码。对于新代码,最好尽可能使用属性。