非整数常量如何在C++中工作?

sbi*_*sbi 8 c++ constants linkage c++98

所以我知道在C++常量中,默认情况下获得的变量与变量不同.这就是我不能放的原因

int foo;
Run Code Online (Sandbox Code Playgroud)

在一些标题中 - 链接器会正确地抱怨多个定义.OTOH,我可以写

const int bar = 42;
Run Code Online (Sandbox Code Playgroud)

在标题中,编译器确保只有一个定义bar.

使用积分常量,很容易看出编译器如何处理这个 - 至少只要没有人获取地址bar或做一些其他有趣的事情,需要它为它分配存储).但是,如果有人怎么办?如果它不是一个整体但需要在运行时执行的代码呢?假设我将其放入标题中:

const std::string baz = "h2g2";
Run Code Online (Sandbox Code Playgroud)

假设没有小的字符串优化,这需要在运行时分配动态内存,因此需要执行代码,地址需要存储在某处,等等.

我假设我最终会得到baz每个翻译单元的一个定义,只是编译器为其分配内部链接以防止链接器抱怨?或者我错过了什么?

注意:constexpr普通的旧C++常量不感兴趣,因为它们自80年代以来就存在并且在C++ 98中编纂.(但是,如果一个全面的答案将包括这一切如何融合在一起constexpr,我不会抱怨.)

Mar*_* A. 4

const默认情况下,像 C++ 中一样声明一个对象(在命名空间范围内)会为其分配内部链接。

如果您声明(并因初始化而定义)

const std::string baz = "h2g2";
Run Code Online (Sandbox Code Playgroud)

在标题中,每个翻译单元都会有一个静态链接的字符串。地址必须存储在每个翻译单元中(每个不同的非堆存储的字符文字有不同的地址 - 只读存储器)

编辑:正如 C++11 题外话constexpr所暗示的那样const,因为它意味着“适合常量表达式求值”,因此它也应该具有内部链接。[注。我没有提到 C++14]

  • 但是,请注意,“constexpr 意味着 const”对于变量来说确实如此,即使在 C++14 中也是如此。 (2认同)