2D 区域的内存布局

Memory layout of 2D area

本文关键字:布局 内存 区域 2D      更新时间:2023-10-16

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

如果需要具体信息:

11-14-C++17

Linux x86

修订版:(感谢用户4581301)

我指的是有一个vector<vector<T>>,其中T是某种定义的类型。我不是在谈论模板编程,除非这不会改变任何东西。

如何实现std::vector的确切细节因编译器而异,但std::vector很可能包含一个存储长度和指向存储的指针的size_t成员。 它使用您在模板中指定的任何分配器来分配此存储,但默认设置是使用new,这会将它们从堆中分配出来。 您可能知道这一点,但通常堆是内存中堆栈下方的 RAM 区域,随着堆栈从上到下的增长,该区域自下而上增长,运行时通过跟踪哪些块可用来管理该区域。

std::vector管理的存储是一个连续的对象数组,因此包含 20 个T向量的向量将至少包含一个存储值 20 的size_t,以及一个指向一个由 20 个结构组成的数组的指针,每个结构包含一个长度和一个指针。 这些指针中的每一个都指向一个连续存储在内存中的T数组。

如果你创建一个矩形二维数组,如T table[ROWS][COLUMNS]std::array< std::array<T, COLUMNS>, ROWS >,你将得到一个以行主顺序存储的 T 元素的连续块,即:第 0 行的所有元素,后跟第 1 行的所有元素,依此类推。

如果您事先知道矩阵的尺寸,矩形数组将更有效,因为您只需要分配一个内存块。这更快,因为您只需要调用分配器和析构函数一次,而不是每行一次,还因为它将位于一个位置,而不是拆分到许多不同的位置,因此单个块更有可能在处理器的缓存中。

vector是围绕动态分配的元素数组的薄包装器。对于vector<vector<T>>,这意味着外部vector的内部数组包含内部vector结构,但内部vector单独分配和管理自己的内部数组(结构包含指向托管数组的指针)。

从本质上讲,2D方面纯粹在程序逻辑中;任何给定"行"的元素都是连续的,但行之间没有指定的空间关系。

真正的 2D 数组(其中底层内存作为单个块分配)只发生在使用 2D 语法 (int foo[10][20];) 和嵌套std::array类型声明的 C 样式数组,或遵循相同基本设计的 POD 类型。