gpt4 book ai didi

c++ - std::array over c 样式数组

转载 作者:太空狗 更新时间:2023-10-29 23:16:22 24 4
gpt4 key购买 nike

有人告诉我,在 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] 作为参数传入,是否还会有任何未定义的行为?

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

最佳答案

Is it possible to pass in std::array as a parameter?

是的。正确的语法是:

Draw(my_array.data());

Will there be any undefined behavior if I were to pass in &vec4[0] as the parameter?

没有。从句法上讲,它不太擅长使您的意图清晰,但从语义上讲是一样的。

In that sense, will it be the same for multi-dimensional arrays?

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

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。如果是这样,那么这两个的存储布局将不相同。

关于c++ - std::array over c 样式数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24226276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com