【发布时间】:2016-12-16 15:58:43
【问题描述】:
我正在尝试定义一些字符串文字和一些常量结构。
做了一些测试,我意识到使用:
constexpr char* name = "name";
constexpr Structure data = {1, 2, 3};
在编译不同的库时,我必须在内存中创建名称地址,并且每个库的数据都不同。 这我真的不想发生。
我又做了一个测试:
constexpr char* name() { return "name"; }
constexpr Structure data() { return Structure{1, 2, 3}; };
当以这种方式编译不同的库时,我发现(至少使用 GCC)内存中名称和数据的地址总是相同的! 即使“数据”在理论上是复制的。
我试图研究这种行为,但我找不到这种行为是否特定于 GCC,或者符号的重用是否符合 C++ 标准。
已编辑 确保 constexpr 数据不会在所有使用它的库中重复的最佳方法是什么?
【问题讨论】:
-
这是在链接器级别完成的。 MS 将此称为相同的 COMDAT 折叠(通用数据)。大多数开发人员都希望这种情况发生。如果链接器没有提供关闭它的开关,您可能不得不求助于堆。
-
我的问题更多是关于我是否可以依赖它。折叠公共数据块对我来说绝对是可取的。
-
对不起,重读了这个问题,我意识到我问的问题与我真正想要的相反。编辑澄清。
-
知道了。为什么不通过 const ref 返回以删除任何副本的想法?
-
我试过了。我收到有关返回临时引用的编译错误。使用 static 给我一个关于在 constexpr 中禁止使用静态的编译错误。
标签: c++ c++11 gcc one-definition-rule