【问题标题】:Where does local const variable will get stored?本地 const 变量将存储在哪里?
【发布时间】:2019-05-27 19:41:02
【问题描述】:

本地 const 变量将存储在哪里?我已经验证,在函数中使用 const 变量的每个地方,都被其值替换(如立即值寻址模式)。但是,如果将指针分配给它,那么它将存储在堆栈中。在这里,我不明白处理器如何知道其常数值的一件事。堆栈中是否有像 .data 部分一样的只读部分?

【问题讨论】:

  • 实现了定义的行为
  • 我说的有点离题了,但我真的认为在你学习的这个阶段你不应该为此担心。 C 不是通用汇编程序。您不应将其视为一个并不断想知道它会产生什么组件。 C 是一种高级语言,用于描述您希望程序具有的行为。然后编译器生成具有该行为的代码。如果它可以证明在你的程序中,那个 const 变量会有一个特定的值,那么它就可以常量折叠。它仍然是相同的行为和有效的程序。

标签: c


【解决方案1】:

我认为这完全取决于您的工具链特定实现。变量存储在 RAM 中,程序存储在闪存中,常量存储在 RAM 或闪存中。 如果我错了,请纠正我。

【讨论】:

  • 看系统是对的。在所有情况下都说“程序存储在闪存中”是不正确的。可能存在这样的系统,但大多数系统为程序使用 RAM。
【解决方案2】:

通常,处理器不知道在 C 中声明了一个对象 const

系统通常具有在程序加载后标记为只读的内存区域,静态const 对象存储在此类内存中。对于这些对象,处理器强制执行只读属性。

系统通常没有用于堆栈的只读内存。这本来就很困难——当函数启动时,内存需要读写,以便可以构造它的堆栈帧,但在其他时候是只读的。因此程序会频繁更改硬件内存保护设置。这会影响性能,通常不值得。

所以程序通常只有一个读写堆栈可用。当你声明一个自动的(而不是静态的)const 对象时,编译器可以把它放在哪里?正如您所注意到的,它通常被优化为指令中的立即操作数。但是,当你取它的地址时,它必须有一个地址,所以它必须在内存中。

一个想法可能是,因为它是const,它不会改变,所以我们只需要一个副本,所以它可以存储在静态只读部分而不是堆栈中。但是,C 标准说每个不同的对象都有不同的地址。为了满足该要求,编译器必须在每次在 C 代码中创建对象时在内存中创建不同的对象实例。将其放入堆栈是一种简单的方法。

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 2017-03-26
    • 2010-10-02
    • 2018-02-01
    • 2017-09-17
    • 2011-04-11
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多