本地const变量将存储在哪里?我已经证实,在函数中使用const变量的每个位置,都将替换为其值(例如立即值寻址模式)。但是,如果将指针分配给它,那么它将被存储在堆栈中。在这里,我不了解处理器如何知道其常数。堆栈中是否有像.data节中一样的只读节?
答案 0 :(得分:2)
通常,处理器不知道在C中将对象声明为const
。
系统通常具有一些内存区域,这些区域在加载程序后标记为只读,并且静态const
对象存储在此类内存中。对于这些对象,处理器将强制使用只读属性。
系统通常没有用于堆栈的只读内存。这本质上是困难的-函数启动时需要对内存进行读写操作,以便可以构造其堆栈框架,但在其他时候为只读。因此,程序将经常更改硬件内存保护设置。这会影响性能,通常认为不值得。
因此,程序通常只有一个可用的读写堆栈。当您声明一个自动的(而不是静态的)const
对象时,编译器可以在哪里放置它?如您所述,它通常被优化为指令中的立即数。但是,当您获取其地址时,它必须具有地址,因此它必须在内存中。
一个想法可能是,由于它是const
,因此不会倒退,因此我们只需要一个副本,因此可以将其存储在静态只读节中,而不是存储在堆栈中。但是,C标准说每个不同的对象都有不同的地址。为了满足该要求,编译器每次在C代码中创建对象时,都必须在内存中创建一个不同的对象实例。将其放在堆栈上是实现此目的的简便方法。
答案 1 :(得分:-1)
我认为这完全取决于您的工具链特定实现。变量存储在RAM中,程序存储在闪存中,常量存储在RAM或闪存中。 如果我错了请纠正我。