分配和初始化大内存 space
Allocating and initializing big memory space
我有一个函数如下:
float* Alocate2DBlankMemoryContinousSpace(int w, int h)
{
float *matrix = (float*)malloc(w*h*sizeof(float));
for (int i = 0; i<w*h; i++)
matrix[i] = 0.0;
return matrix;
}
用于二维分配向量。对于像 w=1000 和 h=1000 这样的小向量,它可以正常工作,但对于更大的向量,存在内存访问冲突写入位置的问题,事实上我有很多空闲内存要写入。如何在连续内存中分配和初始化big space?
一个 1000x1000 float
(32 位)缓冲区将使用 4,000,000 字节 (3.8MiB),这应该 运行 没问题。我很好奇什么值对你来说失败了,也许 10000x10000
会失败,因为那将是一个 381MiB 大小的缓冲区,如果你在 运行 32 位进程 如果您调用您的函数 3 次或更多次,我可以看到您如何 运行 超出 space。
无论如何,你的代码有一些坏习惯,首先是你没有检查分配是否成功,然后你在 calloc
时将自己的内存归零可能会更快。如果分配失败 malloc
将 return NULL
但当您自己将内存归零时,您仍在取消引用指针。
改为这样做:
float* matrix = calloc( width * height, sizeof(float) );
if( matrix == NULL ) exit(1); // Bad-allocation, either terminate or fail gracefully and inform the user of the condition.
return matrix;
我有一个函数如下:
float* Alocate2DBlankMemoryContinousSpace(int w, int h)
{
float *matrix = (float*)malloc(w*h*sizeof(float));
for (int i = 0; i<w*h; i++)
matrix[i] = 0.0;
return matrix;
}
用于二维分配向量。对于像 w=1000 和 h=1000 这样的小向量,它可以正常工作,但对于更大的向量,存在内存访问冲突写入位置的问题,事实上我有很多空闲内存要写入。如何在连续内存中分配和初始化big space?
一个 1000x1000 float
(32 位)缓冲区将使用 4,000,000 字节 (3.8MiB),这应该 运行 没问题。我很好奇什么值对你来说失败了,也许 10000x10000
会失败,因为那将是一个 381MiB 大小的缓冲区,如果你在 运行 32 位进程 如果您调用您的函数 3 次或更多次,我可以看到您如何 运行 超出 space。
无论如何,你的代码有一些坏习惯,首先是你没有检查分配是否成功,然后你在 calloc
时将自己的内存归零可能会更快。如果分配失败 malloc
将 return NULL
但当您自己将内存归零时,您仍在取消引用指针。
改为这样做:
float* matrix = calloc( width * height, sizeof(float) );
if( matrix == NULL ) exit(1); // Bad-allocation, either terminate or fail gracefully and inform the user of the condition.
return matrix;