用C ++填充数组而不翻译索引

时间:2013-05-17 13:30:12

标签: c++ arrays pointers syntax padding

这就是我所拥有的:

int t[MX];

现在,我想重写该代码,以便有效地将单个元素添加到该数组的开头,而不必在其余代码中将所有索引转换为1。该问题的解决方案可能是这样的:

int _t[MX+1];
int * const t = _t+1;

这种方法的问题在于,现在这样的东西不再起作用了:

memset(t, 0, sizeof t);

问题是sizeof t会返回4,而不是我想要的MX * 4.

一种可能的解决方案可能是:

struct
{
    int a;
    int b[MX];
} _t;
int (&t)[MX] = _t.b;

但我发现它相当不优雅和令人不满意。 所以,我的问题是: 还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

不仅第二种解决方案“不优雅且不令人满意”,它也是不确定的行为。有关该主题的更多信息,请参阅this question的答案。

第一个解决方案允许您使用负索引,因为ptr[index]等同于*(ptr + index),因此只要结果指向数组内,您就可以了。

可以通过遵循std::array<T,size_t>的设计者采用的方法来构建sizeof问题的解决方案:创建一个包装数组的模板类,并在其下标运算符中进行索引转换。 / p>

如果这不起作用,您可以回到原来的两个解决方案的组合,但没有未定义的行为,如下所示:

#define MX 1000

typedef int arr_mx[MX];

int _t[MX+1];
arr_mx &t = *((arr_mx*)(&_t[1]));

这是demo of this approach on ideone