不确定什么是“良好做法”或被认为更“正确”。我有一个数组,我想通过arrayname []以外的名称访问各个元素。我可以使用#defines或指针,也可能使用其他方式。
示例:
#define value1 myarray[1]
int myarray[SIZE];
value1 = 5;
或
int myarray[SIZE];
int *ptr;
ptr = &myarray[1];
*ptr = 5;
在我看来,#define路径更简单,使用更少的内存,但可能会带来一些我不知道的问题。任何见解都会很棒,我希望尽可能遵守公认的标准。
*编辑:也许有一个更好的方式。我的最终目标是获得一个将发送出外围端口的阵列。但是,数据由非常不同的数据集组成,并且单个阵列名称不能代表所分配的数据。我的记忆非常有限,所以我想避免双重存储每个值。
答案 0 :(得分:5)
我提出了第三种选择,例如:
#define VALUE1_IDX 1
int myarray[SIZE];
myarray[VALUE1_IDX] = 5;
这超过#1的优势在于你显然使用了myarray,而且优于#2的优势就像你说的那样,避免使用指针。我怀疑,但尚未验证,通过优化,选项#2将没有额外的内存使用,尽管它看起来很直观。
我认为最佳解决方案会因情况而异,我认为您的两个选项中的任何一个都可以在正确的背景下进行辩护。
编辑:为了回应Kevin的评论,首先还要检查当你没有集体处理这些值时是否可以避免使用数组。我意识到在某种情况下,这种情况并不适用,例如,如果您阅读了一条长信息,并希望简单地提取几个关键值。
答案 1 :(得分:2)
为什么不参考?
int A[3];
int& a1=A[1];
答案 2 :(得分:1)
union
是另一种别名变量的方法。但是不要把它作为推荐。如果你依赖别名,它们是危险的(不可移植的)。您应该只使用它们来优化内存使用,以及同时不需要的变量。
答案 3 :(得分:1)
enum {SIZE = 100};
struct Mapping {
int unused1;
int value1;
int unused2;
};
Mapping& AsMapping( int(&array)[SIZE] ) {
return *reinterpret_cast<Mapping*>(&array);
}
int arr[SIZE];
AsMapping(arr).value1 = 5;
Mapping& values = AsMapping(arr);
values.value1 = 5;
这需要没有内存,优化器应该能够擦除所有内容。同时,它是合理可维护的。
在struct
上设置路线可能是您必须要小心的要求。
答案 4 :(得分:0)
你可以做这样的事情
typedef enum
{
foo = 0;
// ... more named values
bar = SIZE;
} Thing;
int value[SIZE];
value[foo] = 5;
答案 5 :(得分:0)
非定义方法允许您从第二种方法中获得一定程度的类型更正。
此外,任何理智编译器生成的实际代码对于两者都是相同的。
所有我都喜欢第二,因为它立即显而易见。另一个问题是#define可能会导致您实际处理范围之外的问题。
使用后者更为明智,因为它意味着其他人不太可能出现并在以后混淆......