繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM