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

bi

因此,我知道在C ++中,常量默认情况下与变量的链接不同。这就是为什么我不能放

int foo;

在某些标头中-链接器会正确地抱怨多个定义太太,我会写

const int bar = 42;

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

使用整数常量,很容易看出编译器是如何处理它的-至少只要没有人接受地址bar或做一些其他有趣的事情(要求它为其分配存储空间)即可。但是,如果有人这样做怎么办?如果它不是一个完整的东西,而是需要在运行时执行代码的东西怎么办?假设我将其放入标题中:

const std::string baz = "h2g2";

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

我以为baz每个翻译单元都会有一个定义,只是编译器为其分配了内部链接以防止链接器抱怨?还是我错过了什么?

注意:constexpr普通的C ++常量不感兴趣,因为它们自80年代就已存在,并且已在C ++ 98中进行了编码。(但是,如果全面的答案包括所有这些如何与融为一体constexpr,我不会对此表示抱怨。)

马可·A

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

如果声明(并由于初始化而定义)

const std::string baz = "h2g2";

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“ Hello World”如何在C中工作

来自分类Dev

内联函数如何在C ++中工作?

来自分类Dev

这在c ++中如何工作?

来自分类Dev

C中的FILE指针如何工作?

来自分类Dev

C中的递归函数如何工作

来自分类Dev

科学记数法对C中的整数常量安全吗?

来自分类Dev

表映射如何在C中工作?

来自分类Dev

整数溢出如何在C中工作?

来自分类Dev

C ++中的反向迭代器如何工作

来自分类Dev

switch语句在C中如何工作?

来自分类Dev

如何使C ++库在Eclipse中工作?

来自分类Dev

C中的位域如何工作?

来自分类Dev

方括号在C中如何工作?

来自分类Dev

函数printf在C中如何工作?

来自分类Dev

Linux C中的read(2)如何工作?

来自分类Dev

如何使strcmp()在我的C程序中工作

来自分类Dev

#include如何在C ++中工作?

来自分类Dev

如何在C中将多字符常量转换为整数?

来自分类Dev

常量在Go中如何工作?

来自分类Dev

当使用带有命名参数的pg-promise时,“ ORDER BY中的非整数常量”

来自分类Dev

c中的整数常量是什么?

来自分类Dev

ios :: fmtflags如何在C ++中工作?setf()如何工作?

来自分类Dev

关于“ C:参考手册”中的整数常量

来自分类Dev

#if宏在C中如何工作?

来自分类Dev

如何在C中暂停非整数时间?

来自分类Dev

合并整数常量在Android中如何工作?

来自分类Dev

常量如何在if块中工作?

来自分类Dev

常量引用如何工作?

来自分类Dev

C 预处理器 #if 处理非整数常量