Std::数组优于c风格数组

std::array over c style array

本文关键字:数组 风格 Std      更新时间:2023-10-16

我被告知,在c++中,应该始终使用std::array而不是C风格的数组。

在查看了周围的问题后,我发现有人说std::array更好。

在这个意义上,我使用了很多std::array,有时当我使用其他库时,我不得不使用接受c风格数组的方法。

例如,我正在使用这个函数

void Draw(float* arg);

是否可以将std::array<float,4>作为参数传递?

如果我传入&vec4[0]作为参数,会有任何未定义的行为吗?

在这个意义上,对于多维数组也是一样的吗?

数组声明为

std::array<std::array<float,4>,4>;

如果我传入&mtx4[0][0]作为参数,还会有任何未定义的行为吗?

编辑:感谢您指出我在多维数组代码中的错误。我编辑的

是否可以传入std::array作为参数?

是的。正确的语法是:

Draw(my_array.data());

如果我传入&vec4[0]作为参数,会有任何未定义的行为吗?

。从语法上讲,它不太善于表达你的意图,但在语义上是一样的。

在这个意义上,对于多维数组也是一样的吗?

是的,如果你指的是经典的C多维数组,它实际上只是与索引信息相关的平面数组。不,如果你说的是C数组的数组

float array2d[5][5]; // ok
float *array2d[5]; // not ok
std::array<std::array<float,5>,5> array2d; // not ok

第一个具有连续存储。另外两个是指针到数组的数组,必须以不同的方式处理。这里没有足够的内容来推荐如何。


我在这里找到了另一个/新的多维数组语法的参考。它应该提供连续存储

std::array<float,5,5>; // should be ok

我真的不知道这个语法的状态是什么。也许其他人可以帮忙。


在对该声明进行进一步研究之后:

std::array<std::array<float,5>,5> array2d;

这里的array2d的存储都是内联的,不涉及指针。在所有情况下,我都能够调查存储似乎是连续的,因此内存布局与

相同。
float array2d[5][5];

这不是标准的要求。一个符合标准的实现可以插入额外的信息或填充,使sizeof(array<T>)在某些t上大于sizeof(T[])。如果它这样做,则这两者的存储布局将不相同。