首页 >后端开发 >C++ >`std::array` 是否具有与常规 C 数组相同的大小和内存布局?

`std::array` 是否具有与常规 C 数组相同的大小和内存布局?

Barbara Streisand
Barbara Streisand原创
2024-12-06 22:10:13180浏览

Does `std::array` have the same size and memory layout as a regular C   array?

C 标准中 std::array 的大小

std::array 的 C 11 规范确保连续存储和性能与常规数组。然而,它提出了一个问题:std::array 是否具有与标准数组相同的大小和内存布局。

根据标准的 §23.3.2.1/2,数组是一个聚合体,可以使用语法初始化:

std::array<T, N> a = { initializer-list };

作为聚合,std::array 必须直接存储初始值设定项列表中的值。虽然理论上 std::array 可以存储辅助数据或与常规数组的对齐方式不同,但这些可能性极不可能。

实际上,大多数编译器将 std::array 视为连续的块内存的大小和布局与常规数组相同。此行为得到第三方文档的支持,并在各种编译器中观察到。

例如,以下代码将 std::array 作为多维数组指针访问,按预期工作:

std::vector<std::array<int, N>> x(M);
typedef int (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer)&x[0][0];
// use y like normal multidimensional array

根据这些观察,通常可以安全地假设:

sizeof(std::array<int, N>) == sizeof(int) * N

但是,重要的是要注意此行为并没有受到标准的严格保证。编译器在如何实现 std::array 方面具有一定的灵活性,标准的未来修订可能会改变这种行为。

以上是`std::array` 是否具有与常规 C 数组相同的大小和内存布局?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn