[英]How do non-integral constants work in C++?
因此,我知道在C ++中,常量默认情况下与变量的链接不同。 这就是为什么我不能放
int foo;
在某些标头中-链接器会正确地抱怨多个定义 。 太太,我会写
const int bar = 42;
在标头中,编译器确保只有bar
的一个定义。
使用整数常量,很容易看出编译器是如何处理的–至少只要没有人取得bar
的地址或进行其他一些有趣的事情(要求它为其分配存储空间)即可。 但是,如果有人这样做怎么办? 如果它不是一个完整的东西,而是需要在运行时执行代码的东西,该怎么办? 假设我将其放入标题中:
const std::string baz = "h2g2";
假设没有小的字符串优化,那么这需要在运行时分配动态内存,因此需要执行代码,地址需要存储在某个地方,等等。
我以为我会以每个翻译单元一个baz
定义结束,只是编译器为其分配了内部链接以防止链接器抱怨? 还是我错过了什么?
注意:我对constexpr
并不感兴趣 ,只是对普通的旧C ++常量不感兴趣 ,因为它们自80年代以来就存在,并在C ++ 98中进行了编码。 (但是,如果全面的答案包括所有这些如何与constexpr
配合使用,我不会对此表示抱怨。)
在C ++中,将对象(在命名空间范围内)声明为const
会默认为其分配内部链接。
如果声明(并由于初始化而定义)
const std::string baz = "h2g2";
在标题中,每个翻译单元都有一个静态链接的字符串。 该地址必须存储在每个转换单元中(每个不同的非堆存储的char文字有不同的地址-只读存储器)
编辑:由于C ++ 11题外constexpr
隐含const
因为它的意思是“ 适合常量表达式求值 ”,因此它也应该具有内部链接。 [Nb。 我没有提到C ++ 14]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.