使用 C++ constexpr 可以创建符号重复?
Using C++ constexpr can create symbol duplication?
我正在尝试定义一些字符串文字和一些常量结构。
做了一些测试我意识到使用:
constexpr char* name = "name";
constexpr Structure data = {1, 2, 3};
编译不同的库时,我必须在内存中创建每个库的名称和数据地址。
这我真的不想发生。
我又做了一个测试:
constexpr char* name() { return "name"; }
constexpr Structure data() { return Structure{1, 2, 3}; };
当以这种方式编译不同的库时,我发现(至少对于 GCC)名称和数据在内存中的地址总是相同的!
即使理论上复制了"data"
我试图研究这种行为,但我找不到这种行为是否是 GCC 特定的,或者符号的重用是否符合 C++ 标准。
已编辑
确保 constexpr 数据不会在所有使用它的库中重复的最佳方法是什么?
根据评论,我想您会想要这样的东西:
struct Structure { int x, y, z; };
static constexpr char const* _name = "name";
static constexpr Structure _data = { 1, 2, 3 };
constexpr char const* get_name() noexcept { return _name; }
constexpr Structure const& get_data() noexcept { return _data; }
那么其他翻译单元会有类似下面的代码:
constexpr char const* n = get_name();
constexpr Structure const& d = get_data();
printf("n: %s", n);
printf("d: %d %d %d", d.x, d.y, d.z);
如果该 TU 具有变量的作用域,您可以静态断言
static_assert(_name == n, "");
static_assert(&_data == &d, "");
希望对您有所帮助。
我正在尝试定义一些字符串文字和一些常量结构。
做了一些测试我意识到使用:
constexpr char* name = "name";
constexpr Structure data = {1, 2, 3};
编译不同的库时,我必须在内存中创建每个库的名称和数据地址。 这我真的不想发生。
我又做了一个测试:
constexpr char* name() { return "name"; }
constexpr Structure data() { return Structure{1, 2, 3}; };
当以这种方式编译不同的库时,我发现(至少对于 GCC)名称和数据在内存中的地址总是相同的! 即使理论上复制了"data"
我试图研究这种行为,但我找不到这种行为是否是 GCC 特定的,或者符号的重用是否符合 C++ 标准。
已编辑 确保 constexpr 数据不会在所有使用它的库中重复的最佳方法是什么?
根据评论,我想您会想要这样的东西:
struct Structure { int x, y, z; };
static constexpr char const* _name = "name";
static constexpr Structure _data = { 1, 2, 3 };
constexpr char const* get_name() noexcept { return _name; }
constexpr Structure const& get_data() noexcept { return _data; }
那么其他翻译单元会有类似下面的代码:
constexpr char const* n = get_name();
constexpr Structure const& d = get_data();
printf("n: %s", n);
printf("d: %d %d %d", d.x, d.y, d.z);
如果该 TU 具有变量的作用域,您可以静态断言
static_assert(_name == n, "");
static_assert(&_data == &d, "");
希望对您有所帮助。