【问题标题】:gcc preserves memory allocation after changing variable declaration order [duplicate]gcc在更改变量声明顺序后保留内存分配[重复]
【发布时间】:2017-02-26 02:44:29
【问题描述】:

我有这种形式的功能:

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

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

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

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

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

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

【问题讨论】:

标签: c gcc


【解决方案1】:

根据GCC documentation "Common Function Attributes"

  • no_reorder

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

"Optimize Options":

  • -fno-toplevel-reorder

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

【讨论】:

  • 这是对另一个问题的回答。这个问题询问单个函数的堆栈框架内的本地(自动存储)顺序。您正在回答有关全局范围内多个事物的 代码 (和静态存储)的问题。 IDK 为什么 OP 接受了这个!
【解决方案2】:

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

【讨论】:

  • volatile 不会覆盖/控制本地人的分配顺序,只会重新排序访问。如果您想控制事物之间的相对位置,请将它们放在 struct 中。
猜你喜欢
  • 2014-08-27
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多