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

时间:2016-10-17 07:42:18

标签: c gcc

我有这种形式的功能:

void authenticate()
{
    int auth_flag;
    char password[16];
    ...
}

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

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

void authenticate()
{
    char password[16];
    int auth_flag;
    ...
}

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

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

2 个答案:

答案 0 :(得分:4)

根据GCC documentation "Common Function Attributes"

  
      
  • no_reorder
  •   
     

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

"Optimize Options"

  
      
  • -fno-toplevel-reorder
  •   
     

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

答案 1 :(得分:1)

实际上,你编译编译器然后编程机器。编译器将决定您的代码。它将在堆栈上执行可能有助于缓存的事情,因此可能会移动事物。将有编译器选项来阻止它这样做。实际上,您可能需要使用volatile关键字来阻止它完全删除变量。