2D区域的内存布局

时间:2018-03-13 22:59:11

标签: c++ memory vector memory-management

内存中的2D区域布局如何?特别是如果它是一个交错的区域。根据我的理解,从Max下降到0,内存是连续的,计算机是否一个接一个地分配区域中的每个区域?如果是这样,那么该区域中的一个区域是否需要调整大小,是否会将所有其他区域向下移动以便为新大小的区域腾出空间?

如果需要具体细节:

C ++ 17 /一十一分之十四

linux x86

修订:(感谢user4581301)

我指的是vector<vector<T>>其中T是某种已定义的类型。我不在这里讨论模板编程,除非它没有改变任何东西。

2 个答案:

答案 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样式数组时才会发生相同的基本设计。