gpt4 book ai didi

c++ - 数组 vector 的内存布局是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:58:57 28 4
gpt4 key购买 nike

谁能解释一下内存布局

std::vector<std::array<int, 5>> vec(2)

它是否提供二维数组的连续内存块有 2 行,每行 5 个元素?

据我了解, vector 的 vector

std::vector<std::vector<int>> vec(2, std::vector<int>(5))

提供两个 长度连续数组 5个元素在内存中的不同位置的内存布局。

数组的 vector 会一样吗?

最佳答案

数组没有任何间接性,只是“直接”存储它们的数据。也就是说,一个 std::array<int, 5>字面上包含五个 int s 连续,平坦。而且,与 vector 一样,它们不会在元素之间添加填充,因此它们是“内部连续的”。

但是,the std::array object itself may be larger than the set of its elements !允许有尾随的“东西”,如填充。因此,尽管有可能,但在第一种情况下,您的数据全部不一定是连续的。

An int
+----+
| |
+----+

A vector of 2 x int
+----+----+----+-----+ +----+----+
| housekeeping | ptr | | 1 | 2 |
+----+----+----+-----+ +----+----+
| ^
\-----------

An std::array<int, 5>
+----+----+----+----+----+----------->
| 1 | 2 | 3 | 4 | 5 | possible cruft/padding....
+----+----+----+----+----+----------->

A vector of 2 x std::array<int, 5>
+----+----+----+-----+ +----+----+----+----+----+----------------------------+----+----+----+----+----+----------->
| housekeeping | ptr | | 1 | 2 | 3 | 4 | 5 | possible cruft/padding.... | 1 | 2 | 3 | 4 | 5 | possible cruft/padding....
+----+----+----+-----+ +----+----+----+----+----+----------------------------+----+----+----+----+----+----------->
| ^
\-----------

而且,即使是这样,由于别名规则,您是否能够使用单个 int*浏览所有 10 个数字可能是另一回事!

总之,一个十个 vector int s 会更清晰,包装更完整,使用起来可能更安全。

在 vector 的 vector 的情况下, vector 实际上只是一个指针加上一些内务,因此是间接的(如你所说)。

关于c++ - 数组 vector 的内存布局是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54197195/

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