gpt4 book ai didi

c++ - 内联函数静态常量是否唯一?

转载 作者:可可西里 更新时间:2023-11-01 16:07:45 25 4
gpt4 key购买 nike

这是一个示例代码:

enum Foo // or enum class whatever
{ BAR
, STUFF
};

inline const char* to_string( const Foo& foo )
{
static const char* const NAMES[] =
{ "BAR"
, "STUFF"
};
// let's assume I have some boundary checks here, it's not the point
return NAMES[foo];
};

这个函数是内联的,在几个编译单元中使用的头文件中。这里的目标是让编译器在没有使用这个函数的情况下什么都不做。

问题:

  1. C++ 标准是保证 NAMES 只存在于一个目标文件中,还是留给编译器决定,还是保证每个目标文件都有它的拷贝?
  2. 如果有多个拷贝,是否会出现链接问题(我假设我无法测试足够多的编译器来检查这一点)。
  3. gcc、msvc 和 clang 是否都会通过使最终二进制文件只有一个 NAMES 实例来优化这种情况?

最佳答案

是的,标准保证只有一个对象。来自 C++03 §7.1.2/4:

[...] A static local variable in an extern inline function always refers to the same object. A string literal in an extern inline function is the same object in different translation units.

(请注意,extern inline 函数是具有外部链接的 inline 函数,即未标记为 static 的 inline 函数。)

它出现在哪个目标文件中取决于编译器,但我怀疑发生的情况是每个使用它的目标文件都会得到一个拷贝,链接器会任意选择一个符号并丢弃其余的。

关于c++ - 内联函数静态常量是否唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299742/

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