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中文网其他相关文章!