非整型常量如何在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";
将放入头文件中,每个翻译单元将有一个静态链接字符串。地址必须存储在每个转换单元中(每个不同的非堆存储的字符量都有不同的地址—只读内存)
编辑:作为c++ 11的题外话,constexpr
暗示const
,因为它意味着"适合常量表达式求值",因此它也应该有内部链接。(Nb。我没有提到c++ 14]
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作