我有这种形式的功能:
void authenticate()
{
int auth_flag;
char password[16];
...
}
当我调试程序时,我可以看到 auth_flag 变量位于堆栈中的密码变量之后(看起来很正常)。
现在当我改变变量声明的顺序时:
void authenticate()
{
char password[16];
int auth_flag;
...
}
我看到变量 auth_flag 仍然在堆栈中的密码变量之后分配。
无论是使用编译选项还是代码内编译器指令,我正在寻找的任何方法都可以避免/控制它。
答案 0 :(得分:4)
根据GCC documentation "Common Function Attributes":
no_reorder
不要对彼此标记为
no_reorder
的函数或变量或可执行文件的顶级汇编程序语句重新排序。程序中的实际顺序取决于链接器命令行。标记为这样的静态变量也不会被删除。这与-fno-toplevel-reorder
选项具有类似的效果,但仅适用于标记的符号。
-fno-toplevel-reorder
不要重新排序顶级函数,变量和asm语句。以与它们在输入文件中出现的顺序相同的顺序输出它们。使用此选项时,不会删除未引用的静态变量。此选项旨在支持依赖于特定排序的现有代码。对于新代码,最好在可能的情况下使用属性。
答案 1 :(得分:1)
实际上,你编译编译器然后编程机器。编译器将决定您的代码。它将在堆栈上执行可能有助于缓存的事情,因此可能会移动事物。将有编译器选项来阻止它这样做。实际上,您可能需要使用volatile关键字来阻止它完全删除变量。