4

不确定什么是“良好做法”或被认为更“正确”。我有一个数组,我想通过数组名 [] 以外的名称访问单个元素。我可以使用#defines 或指针,也可能是其他方式。

例子:

#define value1 myarray[1]

int myarray[SIZE];
value1 = 5;

或者

int myarray[SIZE];
int *ptr;
ptr = &myarray[1];
*ptr = 5;

在我看来,#define 路线更简单,使用更少的内存,但可能会带来一堆我不知道的问题。任何见解都会很棒,我喜欢尽可能让我的代码遵循普遍接受的标准。

*编辑:也许有更好的方法。我的最终目标是获得一个将发送到外围端口的阵列。然而,数据由非常不同的数据集组成,单个数组名称不能代表所分配的数据。我的内存非常有限,所以我想避免重复存储每个值。

4

6 回答 6

5

我提出了第三种选择,例如:

#define VALUE1_IDX  1

int myarray[SIZE];
myarray[VALUE1_IDX] = 5;

与#1 相比,它的优势在于,您使用 myarray 仍然很明显,而与 #2 相比,优势在于,正如您所说,避免使用指针。我会怀疑,但尚未验证,通过优化,选项#2 不会有额外的内存使用,尽管它看起来很直观。

我认为最好的解决方案会因情况而异,我认为您的两个选项中的任何一个在正确的情况下都是可以辩护的。

编辑:为了回应 Kevin 的评论,首先值得检查的是,当您不集体处理这些值时,是否可以避免使用数组。我意识到在某些情况下这肯定不适用,例如,如果您阅读了长消息并想简单地提取几个关键值。

于 2012-12-14T20:49:12.380 回答
2

为什么不参考?

int A[3];  
int& a1=A[1];
于 2012-12-14T21:20:45.407 回答
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;

这几乎不需要内存,优化器应该能够擦除所有内容。同时,它是合理可维护的。

在您的 s 上设置对齐struct可能是您必须小心的要求。

于 2012-12-14T21:49:07.880 回答
1

unions 是别名变量的另一种方式。但不要将此作为建议。如果您依赖别名,它们是危险的(不可移植的)。对于不需要的变量,您应该只使用它们来优化内存使用。

于 2012-12-14T20:50:16.157 回答
0

非定义方法允许您一定程度的类型更正,这是第二种方法所不具备的。

此外,任何理智的编译器生成的实际代码对于两者都是相同的。

总而言之,我更喜欢第二个,因为它是立即显而易见的。另一个问题是#define 可能会导致超出您实际处理的区域范围的问题。

使用后者更明智,因为这意味着其他人不太可能在以后出现并搞砸它......

于 2012-12-14T22:28:32.000 回答
0

你可以做这样的事情

typedef enum
{
    foo = 0;
    // ... more named values
    bar = SIZE;
} Thing;

int value[SIZE];
value[foo] = 5;

使用枚举作为数组索引

于 2012-12-14T21:00:16.480 回答