内存中的2D区域布局如何?特别是如果它是一个交错的区域。根据我的理解,从Max下降到0,内存是连续的,计算机是否一个接一个地分配区域中的每个区域?如果是这样,那么该区域中的一个区域是否需要调整大小,是否会将所有其他区域向下移动以便为新大小的区域腾出空间?
如果需要具体细节:
C ++ 17 /一十一分之十四
锵
linux x86
修订:(感谢user4581301)
我指的是vector<vector<T>>
其中T
是某种已定义的类型。我不在这里讨论模板编程,除非它没有改变任何东西。
答案 0 :(得分:2)
std::vector
如何实现的确切细节因编译器而异,但很可能,std::vector
包含存储长度的size_t
成员和指向该new
的指针。存储。它使用您在模板中指定的任何分配器来分配此存储,但默认情况下使用std::vector
,它将它们分配给堆。您可能知道这一点,但通常堆是内存中堆栈下方的RAM区域,随着堆栈从上到下增长而从底部向上增长,运行时通过跟踪哪些块是空闲来管理。 / p>
由T
管理的存储是一个连续的对象数组,因此size_t
的二十个向量的向量至少包含一个存储值20的T
和一个指针到20个结构的数组,每个结构包含一个长度和一个指针。每个指针都指向一个T table[ROWS][COLUMNS]
数组,在内存中连续存储。
如果您改为创建一个矩形二维数组,例如std::array< std::array<T, COLUMNS>, ROWS >
或{{1}},您将获得以行主顺序存储的单个连续T元素块,即:第0行的所有元素,后跟第1行的所有元素,依此类推。
如果您事先知道矩阵的尺寸,矩形阵列将更有效,因为您只需要分配一块内存。这样更快,因为你只需要一次调用分配器和析构函数,而不是每行调用一次,也因为它将在一个地方,而不是分散在许多不同的位置,因此单个块更多可能在处理器的缓存中。
答案 1 :(得分:1)
vector
是围绕动态分配的元素数组的瘦包装器。对于vector<vector<T>>
,这意味着外部vector
的内部数组包含内部vector
结构,但内部vector
分别分配和管理自己的内部数组(该结构包含一个指向托管数组的指针。
基本上,2D方面纯粹是程序逻辑;任何给定“行”的元素是连续的,但行之间没有指定的空间关系。
真正的2D数组(其中底层内存被分配为单个块)仅在使用2D语法(int foo[10][20];
)和嵌套std::array
类型或POD类型声明的C样式数组时才会发生相同的基本设计。