使用C ++ constexpr可以创建符号重复吗?

阿尔贝托

我正在尝试定义一些字符串文字和一些常量结构。

做一些测试,我意识到使用:

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数据在使用它的所有库中不重复的最佳方法是什么?

杰夫

根据评论,我怀疑您会想要一些简单的东西:

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, "");

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可以在constexpr中使用std :: string吗?

constexpr可以与volatile结合使用吗?

创建存档时,可以在 Gym(构建)中重复使用扫描(构建和测试)吗?

我可以像使用函数一样创建一个重复的类吗

可以重复使用Task吗?

C ++ constexpr-值可以在编译时求值吗?

constexpr函数可以在C ++中加载文件吗?

`constexpr` 函数可以在 C++ 中前向声明吗?

您可以使用constexpr变量的地址吗?

我们可以在C ++中的if语句中使用符号吗?

我可以在控件的Content属性中使用符号“ <-”吗?

我可以在sympy中使用符号跨产品操作吗

我可以在 Isabelle 中使用否定版本的任意符号吗?

我可以使用无符号长整型数组吗

我可以在EFI引导分区中使用符号链接吗?

我可以在Java中以点符号使用变量吗?

可以创建任意类型的 constexpr 链表吗?

我可以使用@_silgen_name公开不是Swift功能的[Objective-] C或C ++符号吗?

C ++重复符号

C#JITter可以优化重复的委托调用吗?

可以在不同版本上重复使用 Docker 标签吗?

我可以在$ readmemb或$ readmemh中使用串联,重复或`define吗?

可以使用tkinter按钮重复更改画布对象吗?

可以使用Angular * ngFor重复静态内容吗

在Aurelia中,可以在重复中使用插槽进行绑定吗?

我可以使用distinctUntilKeyChanged来删除重复的对象吗?

我可以创建可以在ngStyle或ngClass中使用的数组吗?

ES6对象速记符号可以与常规对象符号结合使用吗?

使用 if constexpr 删除重复代码