我有一个带有静态链接的C ++全局多维数组。我假设它将被堆栈分配(我找不到标准中的相关部分)。它是连续分配的吗?
另一个问题: 我想将这些静态全局n-dim数组转换为在堆上分配。考虑到我希望最小化代码更改,最简单的方法是什么?我可以想到在退出main之前将数组转换为n-dim指针并在main和free'ing开始时进行malloc'ing。但我不得不担心连续分配。有人看到更好的方法吗?
谢谢,
Nilesh制作。
答案 0 :(得分:2)
我有一个带有静态链接的C ++全局多维数组。我假设它将被分配堆栈(我找不到标准中的相关部分)。
它不会在堆栈上;它将在全球范围内。全局变量和静态存储对象获得它们自己的内存区域,该区域不是堆或堆栈的一部分。
此外,堆栈(标准称之为“自动”存储)对象只持续它们所属的函数调用;在调用main()
之前初始化全局变量,并在main()
退出后销毁。
是否连续分配?
可能是,虽然我怀疑标准需要它。 (澄清:保证1-D阵列的连续存储,但不能保证2-D和up阵列中的行之间没有“间隙”。)如果需要连续分配,请将全局数组声明为 - 维向量并使用内联函数将多个维度转换为相应的索引。如果保证连续存储,它与编译器生成的内容相同。
我想将这些静态全局n-dim数组转换为在堆上分配。考虑到我希望最小化代码更改,最简单的方法是什么?
将全局声明从数组更改为指针。在这种情况下,强烈建议对存储进行矢量化。 (不,我不是在谈论std::vector
,我在谈论重塑为一维向量。)
我可以考虑将数组转换为n-dim指针
没有这样的野兽。 Closes是指向指针数组的指针,指针指向更多指针的向量或数组,深度由维数决定。使用将N-D坐标转换为1-D指数的函数来设置,也比上述1-d矢量情况慢得多。
在离开主要城市之前,主要和自由的开始进行malloc'ing。
除非您使用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 []
以隐藏一些丑陋的方法,但这是让你前进的最小方法。
答案 1 :(得分:1)
它没有在堆栈上分配。全局变量在特殊内存段中“分配”。
在使你的多维数组“连续”时,我能想到的最简单的万无一失的方法是在不对类型系统进行过多打击的情况下,制作一个较低维度的typedef
并指向该类型。
typedef int TenIntegers[10];
TenIntegers* ints;
int main()
{
ints = new TenIntegers[50];
// your code here
ints[0][5] = 3;
delete[] ints;
}
答案 2 :(得分:0)
1)全局变量的内存分配在“内存中”。它既不在堆栈上,也不在堆上。例如,全局常量通常放在可执行文件的只读部分中。严格来说,它依赖于实现。为什么你需要知道这个?
2)记忆将是连续的。