C++全局阵列分配
C++ global array allocation
我有一个具有静态链接的C++全局多维数组。我假设它将被堆栈分配(我在标准中找不到相关部分(。是否连续分配?
另一个问题:我想将这些静态全局 n-dim 数组转换为在堆上分配。考虑到我想最小化代码更改,最简单的方法是什么?我可以考虑将数组转换为 n-dim 指针,并在 main 开始时进行错误定位,并在退出 main 之前进行释放。但我不得不担心连续的分配。有人看到更好的方法吗?
谢谢
尼莱什。
我有一个具有静态链接的C++全局多维数组。我假设它将被堆栈分配(我在标准中找不到相关部分(。
它不会在堆栈上;它将在全球区域。全局变量和静态存储对象获得自己的内存区域,该区域既不是堆的一部分,也不是堆栈的一部分。
此外,堆栈(标准称之为"自动"存储(对象只持续到它们所属的函数调用;全局变量在调用之前初始化main()
并在main()
退出后销毁。
是否连续分配?
可能是,尽管我怀疑标准要求它。(澄清:保证一维数组的连续存储,但不能保证二维和更高阵列中的行之间没有"间隙"。如果需要连续分配,请将全局数组声明为一维向量,并使用内联函数将多个维度转换为相应的索引。这与编译器在保证连续存储时生成的内容相同。
我想将这些静态全局 n-dim 数组转换为在堆上分配。考虑到我想最小化代码更改,最简单的方法是什么?
将全局声明从数组更改为指针。在这种情况下,强烈建议对存储进行矢量化。(不,我不是在谈论std::vector
,我说的是重塑为一维矢量。
我可以考虑将数组转换为 n 暗指针
没有这样的野兽。Closes 事物是指向指针数组的指针,然后指向向量或更多指针数组,深度由维度数决定。设置一维向量情况会很熊,而且比上面的一维向量情况慢得多,其中包含将 N-D 坐标转换为一维索引的功能。
在 Main 的开头进行 malloc'ing,在退出 Main 之前释放。
这,除了你不必在最后free
,除非你使用valgrind
或类似的东西来查找内存泄漏。操作系统会在进程退出时释放所有不是共享内存的分配。
所以你会得到类似的东西:
#include <stddef.h>
static const size_t kDimX = 5;
static const size_t kDimY = 20;
static const size_t kDimZ = 4;
inline size_t DimsToVector(size_t x, size_t y, size_t z)
{
return (x * kDimY + y) * kDimZ + z;
}
float* data = 0;
int main()
{
data = new float[kDimX * kDimY * kDimZ];
// Read elements with: data[DimsToVector(x, y, z)]
// Write v with: data[DimsToVector(x, y, z)] = k;
delete[] data; // Optional.
}
有一些更奇特的方法,可能是 Boost 中的一种,它定义类并覆盖operator []
以隐藏一些丑陋的东西,但这大约是让你继续前进的最低限度。
它不会在堆栈上分配。全局变量被"分配"在一个特殊的内存段中。
至于使多维数组"连续",我能想到的最简单的可靠方法,无需过多地反对类型系统,就是对较低维度进行typedef
并制作指向该类型的指针。
typedef int TenIntegers[10];
TenIntegers* ints;
int main()
{
ints = new TenIntegers[50];
// your code here
ints[0][5] = 3;
delete[] ints;
}
1(全局变量的内存被分配到"内存"的某个地方。它既不在堆栈上,也不在堆上。例如,全局常量通常放在可执行文件的只读部分。严格来说,它取决于实现。你为什么需要知道这个?
2(记忆将是连续的。
- 二维阵列的动态分配
- 为什么删除分配的阵列会导致内存错误?
- 新的阵列分配
- 分配给阵列时出现分段错误?黑客排名 2D 阵列 - DS.
- 分配/访问2d阵列,使得2d子块是连续的
- 重新分配2D阵列并删除旧阵列
- 轻松C++阵列分配
- 英特尔并行工作室 2015 C++中的 2D 动态分配全局阵列
- 解除分配此特定 2D 阵列的内存
- 我可以在堆栈上分配`std :: array`阵列,而不知道编译时大小
- 通过"Value Template Argument"与常规阵列在堆栈中分配内存
- C - 将所有分配的双阵列对齐至32 bytes
- 重新分配指针阵列的一部分的安全方法
- 动态分配'string'阵列
- 未分配阵列上的编号
- 与其所有者一起分配阵列的正确方法
- 为 C++ + OpenGL + QT 分配阵列
- 分配阵列时bad_alloc
- C++中2D动态内存分配阵列中的空闲分配内存
- C++中的2D动态内存分配阵列