gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:56:50 25 4
gpt4 key购买 nike

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

int foo;

在某些 header 中——链接器会正确地提示 multiple definitions . OTOH,我会写

const int bar = 42;

在 header 中,编译器确保只有一个 bar 定义。

有了整数常量,很容易看出编译器是如何处理这个问题的——至少只要没有人获取 bar 的地址或做一些其他需要它为其分配存储空间的有趣事情).但是,如果有人这样做怎么办?如果它不是一个整体而是需要在运行时执行代码的东西怎么办?假设我把它放到标题中:

const std::string baz = "h2g2";

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

我假设我最终会为每个翻译单元定义一个 baz ,只是编译器为其分配内部链接以防止链接器提示?或者我错过了什么?

注意:constexpr 不感兴趣,只是对普通的旧 C++ 常量感兴趣,因为它们存在自 80 年代以来,并被编入 C++98。 (但是,如果一个全面的答案包括这一切如何与 constexpr 结合在一起,我就不会对此提示。)

最佳答案

在 C++ 中将对象(在命名空间范围内)声明为 const 会默认为其分配内部链接。

如果你声明(并且因为初始化而定义)

const std::string baz = "h2g2";

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

编辑:作为 C++11 的题外话 constexpr 暗示 const 因为它意味着“适合常量表达式求值”,因此它应该也有内部联系。 [注意。 I'm not mentioning C++14]

关于c++ - 非整数常量如何在 C++ 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24782186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com