gpt4 book ai didi

c++ - 如何访问一系列常量变量作为常量数组

转载 作者:行者123 更新时间:2023-11-28 04:47:55 25 4
gpt4 key购买 nike

很明显我可以:

const TYPE a();
const TYPE b();
const TYPE c();

我可以拥有

const TYPE all[] = {
TYPE(),
TYPE(),
TYPE(),
};

但我希望同时拥有 - 直接访问和数组访问。

反正内存布局应该是一样的。我想到了 union 的想法。类似的东西:

union FOO {
struct index_t {
TYPE a;
TYPE b;
TYPE c;
} index;
TYPE all[];
};

const FOO foo;
foo.index.a;
foo.all[0];

天真的方法是只使用数组中的引用

const TYPE a();
const TYPE b();
const TYPE c();

const TYPE all[3] = {
a,
b,
c,
};

问题是:我能否确定这些只是 3 个实例,或者是否有一些复制正在将它们变成 6 个?是否有任何内存开销?

那么走哪条路最好呢?这两种方法都可行吗?

注意:当然也可以选择使用指针数组 - 但目标是找到一种仅使用引用的方法。

最佳答案

数组变量序列(技术上是对象,但这里的区别并不重要)。你不需要另一个。

TYPE all[3]; // use std::array instead if you can

这就是所需要的const 在这里并不特别重要,根据需要添加或删除它。

现在,如果您渴望使用语法糖并且想要all[0] 别名为 a 等,这是可能的,但这可能性可能伴随着成本。

TYPE &a=all[0], &b=all[1], &c=all[2]; 

编译器可能会为 a、b 和 c 分配存储空间,尤其是当它们是类中的成员时(这是您的成本)。当它们是静态或自动变量时,它可能会或可能不会优化它们。

需要强调的是,a、b 和 c 不是需要的。它们只是为已经存在的对象 all[i] 提供备用名称。

另一种实现方式如下

inline TYPE & a() { return all[0]; } // etc

这不太可能有任何运行时成本,因为编译器非常擅长优化这些微不足道的函数。缺点是您需要编写 a() 而不是 a

union 方法,即使您设法让它为您工作,也是危险的并且不推荐,因为它必然会调用未定义的行为。

关于c++ - 如何访问一系列常量变量作为常量数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48881597/

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