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

标签 c++ c++11 language-lawyer stdvector stdarray

谁能解释一下内存布局

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/

相关文章:

c++ - 覆盖私有(private)函数

c++ - 在另一个成员函数的尾随返回类型中获取推导成员函数的 decltype 是否格式正确?

c++ - 一个 STL 字符串类可以容纳多少个字符?

c++ - 纳秒和计时 C++

c++ - STL 容器 move 语义并按值返回 : how many times of copying get avoided away?

c++ - C++中复制构造函数的困惑

c++ - 为什么我不能返回这个 vector 的 vector ?

c++ - 通过检测图像中的特定大对象或 Blob 来裁剪图像?

c++ - 使用间接父类的方法

c++ - scanf 中的赋值顺序有保证吗?