重命名(别名)数组元素 C

Renaming (aliasing) array elements C

本文关键字:数组元素 别名 重命名      更新时间:2023-10-16

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

例:

#define value1 myarray[1]
int myarray[SIZE];
value1 = 5;

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

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

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

我通过示例提出了第三个选项:

#define VALUE1_IDX  1
int myarray[SIZE];
myarray[VALUE1_IDX] = 5;
与 #1 相比,

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

我认为

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

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

为什么不是引用?

int A[3];  
int& a1=A[1];

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

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上设置对齐方式可能是您必须小心的要求。

你可以做这样的事情

typedef enum
{
    foo = 0;
    // ... more named values
    bar = SIZE;
} Thing;
int value[SIZE];
value[foo] = 5;

使用枚举作为数组索引

非定义方法允许您获得第二种方法无法获得的类型校正程度。

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

总而言之,我更喜欢第二个,因为立即可以看到正在发生的事情。 另一个问题是,#define 可能会导致您实际处理的区域范围之外的问题。

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