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,我不会抱怨.)
const默认情况下,像 C++ 中一样声明一个对象(在命名空间范围内)会为其分配内部链接。
如果您声明(并因初始化而定义)
const std::string baz = "h2g2";
Run Code Online (Sandbox Code Playgroud)
在标题中,每个翻译单元都会有一个静态链接的字符串。地址必须存储在每个翻译单元中(每个不同的非堆存储的字符文字有不同的地址 - 只读存储器)
编辑:正如 C++11 题外话constexpr所暗示的那样const,因为它意味着“适合常量表达式求值”,因此它也应该具有内部链接。[注。我没有提到 C++14]