Std::数组优于c风格数组
std::array over c style array
我被告知,在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[])
。如果它这样做,则这两者的存储布局将不相同。
相关文章:
- 用现代C++STL数据结构替换旧的C风格数组
- 使用模板返回通用的C风格数组
- C .何时删除C风格数组以自由存储器
- constexpr返回多维C风格数组的尺寸元组
- 是否有一种替换C风格的Bool数组的标准方法
- 如何通过Boost::MPI发送2d C风格的数组
- 使用PINVOKE编组LPWSTR的C风格数组,以托管字符串[]
- matlab风格的C++数组索引
- 如何从C++中最好地调用具有C99风格数组函数签名的函数
- 如何从C风格的constchar*数组中提取整数
- C++中Fortran风格的多维数组
- Java中数组的创建(C++风格)
- 使用c风格数组作为STL字符串操作的后端
- 删除c风格的int向量数组
- 将任何容器转换为c风格的数组视图
- c++中C99风格的变长数组函数签名
- 带有std::array的可变进模板结构体与c风格数组成员的区别
- Std::数组优于c风格数组
- 使用2D c风格的数组崩溃
- 如何廉价地将c风格数组赋值给std::vector