有人告诉我,在C ++中,应该始终使用std::array
而不是c-style数组。
在查看问题后,我遇到人们说std :: array更好。
从这个意义上说,我使用了很多std::array
,有时当我使用其他库时,我必须使用带有c风格数组的方法。
例如,我正在使用此功能
void Draw(float* arg);
是否可以传递std::array<float,4>
作为参数?
如果我传入&amp; vec4 [0]作为参数,是否会有任何未定义的行为?
从这个意义上讲,多维数组是否相同?
将此数组声明为
std::array<std::array<float,4>,4>;
如果我传入&amp; mtx4 [0] [0]作为参数,是否还会有任何未定义的行为?
编辑:感谢您在多维数组的代码中指出我的错误。我编辑了它。
答案 0 :(得分:0)
是否可以将std :: array作为参数传递?
是。正确的语法是:
Draw(my_array.data());
如果我传入&amp; vec4 [0]作为参数,是否会有任何未定义的行为?
没有。从语法上讲,它不太善于使你的意图清晰,但在语义上它是相同的。
从这个意义上讲,多维数组是否相同?
是的,如果你的意思是经典的C多维数组,它实际上只是与索引信息相关的平面数组。不,如果你的意思是C array-of-array。
float array2d[5][5]; // ok
float *array2d[5]; // not ok
std::array<std::array<float,5>,5> array2d; // not ok
第一个有连续存储。另外两个是指向数组的指针数组,必须以不同的方式处理。这里没有足够的推荐方法。
我找到了多维数组的另一个/新语法的引用here。它应该提供连续的存储。
std::array<float,5,5>; // should be ok
我真的不知道这种语法的状态是什么。也许其他人可以提供帮助。
在对此声明进行进一步调查之后:
std::array<std::array<float,5>,5> array2d;
此处的array2d存储全部内联,不涉及指针。在所有情况下,我能够调查存储看起来是连续的,因此内存布局与
相同float array2d[5][5];
这不是标准的要求。符合条件的实现可以插入额外的信息或填充,使sizeof(array<T>)
大于sizeof(T[])
对于某些T。如果确实如此,则这两者的存储布局将不同。