C++全局阵列分配

C++ global array allocation

本文关键字:分配 阵列 全局 C++      更新时间:2023-10-16

我有一个具有静态链接的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(记忆将是连续的。