2D 区域的内存布局
Memory layout of 2D area
内存中的二维区域布局如何?特别是如果它是一个交错的区域。据我了解,鉴于内存是从 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 类型。
- 将布局映射到内存地址
- C++继承的虚拟类的内存布局
- 检查nullptr是否100%保护内存布局不受segfault影响
- C++ Python 的扩展 - 安全内存访问和内存布局
- 类似元组的类模板的反向内存布局
- 在C++标准中记录对象的内存布局的哪个位置?
- C++ Lambda 的内存布局
- 打包类的内存布局 + 继承
- 假设传递给 OpenGL 的结构数组的内存布局存在潜在错误
- COM 互操作结构定义与内存布局不匹配
- C++非虚拟类成员变量内存布局?
- 结构中的内存布局差异
- 2D 区域的内存布局
- 如果"原子"<T>是无锁的并且与"T"的大小相同,内存布局是否相同?
- 是C 单继承的内存布局与此C代码相同
- 直观的内存布局,可实现快速SIMD/面向数据的设计
- 使用GDB并检查Data的内存布局
- 对齐方式究竟如何影响内存布局和新放置的巴哈维?
- 数组向量的内存布局是什么
- 为什么C 标准专门为具有不同访问说明符的类数据成员的内存布局提供了余地