谁能解释一下内存布局
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/