constexpr变量存储在哪里?

4

我看到在stackoverflow上人们对于constexpr变量进行了广泛的讨论,但是有一件事情却没有人谈到:

constexpr变量存储在哪里?

每个人都知道C和C++程序的内存位置表:

  • 堆栈
  • 静态
  • 文本

操作系统(例如Linux)
对于操作系统,可执行代码和所有静态变量从硬盘驱动器中复制到RAM中分配的文本、静态等区域。然后程序作为一个进程启动。

嵌入式系统(例如Atmel控制器)
对于嵌入式系统,情况就不同了。这里的可执行代码和文字常量被永久存储在闪存中;只有静态变量被复制到RAM中。

文本或静态区域
我理解constexpr相比于#defines的好处,但对于嵌入式系统程序员来说,性能问题始终存在。在嵌入式系统中,RAM是一种昂贵的资源。因此,我需要知道constexpr变量是存储在文本区域还是静态区域。更准确地说,它们是永久存储在闪存中还是作为变量真正创建到嵌入式系统的RAM中?


4
它们为什么一定要被“存储”呢?如果表达式计算结果是一个简单的整数常量,它可能会直接成为生成的汇编代码中的立即值,或者从函数自己的常量池中加载(也就是仍然在代码段内)。 - Karl Knechtel
4
编译器通常足够智能,避免将只读对象使用读/写内存。因此,你的constexpr很可能不会占用RAM。它是否存储为flash中的字面量,编码为指令中的立即操作数,或在运行时计算,甚至完全优化掉,取决于许多因素。 - Nate Eldredge
1
在某些情况下,constexpr 在编译后可能根本不存在。它们驱动代码的生成,但它们不必存在于代码(或数据)中。 - john
1
“每个人都知道C和C++程序的内存位置表。”-- 我猜我不是其中的一员,因为我对这个“每个人”并不了解?据我所知,C和C++在内存位置方面是中立的,部分原因是嵌入式系统可以与PC处理这些位置的方式不同。 - JaMiT
1
嗯...我在 Stack Overflow 上搜索了 [c++] Where are constexpr variables stored 并找到了 Where and how are constants stored?。我猜这不是重复的,因为这个问题声称这个问题是“没有人谈论”的东西,而我不想声称那些贡献者是“没有人”。我猜想从 constconstexpr 的更改可能会导致一个值从闪存移动到 RAM?但是,这个答案 似乎足以很好地回答当前的问题。 - JaMiT
显示剩余2条评论
1个回答

2

constexpr并不会改变变量的存储类。因此,有了constexpr并不会改变编译器可以放置变量的位置。

然而,constexpr变量有一些重要的特点。任何变量都可能具备这些特点,但是constexpr限定符明确要求:

  1. 该变量不能被更改(隐式为const)。
  2. 该变量用编译时常量表达式初始化。

鉴于这些事实,编译器可以将存储基本上放在任何地方。如果类型与寄存器类型匹配,并且值足够大,可以通过单个“加载字面值”操作码加载,则编译器可以将变量的每个使用转换为仅将字面值加载到寄存器中。

当然,如果您开始做一些像获取变量地址之类的事情,它可能需要占用实际存储空间。但即使如此,这也取决于编译器内联的好坏程度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接