【问题标题】:Allocating and initializing big memory space分配和初始化大内存空间
【发布时间】:2015-09-03 22:07:37
【问题描述】:

我的功能如下:

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 这样的小向量,它可以正常工作,但是对于更大的向量,内存访问冲突写入位置存在问题,事实上我有很多空闲内存要写入。如何在连续内存中分配和初始化大空间?

【问题讨论】:

  • 你不需要将你自己的内存归零,使用calloc而不是malloc,它会为你归零,大概比你的程序本身更快。
  • 你能给出一个失败的 w,h 吗?平台/32/64 位等信息也很有价值。
  • “但是对于更大的向量存在问题” 是的,这并不奇怪。在您告诉我们“更大”是什么之前,以“不清楚您要问什么”结束投票。
  • 好的,谢谢回复。我使用乘数增加矩阵的体积,我将内存不足,因为我尝试如下:int w=1000*multiplier 和 int h=1000*multiplier。
  • 是的,multiplier 的什么值会导致问题?

标签: c memory memory-management malloc


【解决方案1】:

1000x1000 float(32 位)缓冲区将使用 4,000,000 字节 (3.8MiB),应该可以正常运行。我很好奇什么值对你来说失败了,也许 10000x10000 会失败,因为那将是一个 381MiB 大小的缓冲区,如果你在 32 位进程中运行,我可以看到你可能会如何如果你调用你的函数 3 次或更多次,空间就会用完。

无论如何,您的代码中有一些坏习惯,首先是您没有检查分配是否成功,然后您将自己的内存归零,而calloc 可能会更快.如果分配失败malloc 将返回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;

【讨论】:

  • 取决于平台,int 也可能是 != size_t。如果说你有一个奇怪的平台,其中 size_t 是 64 位,int 是 16 位,你可能会在 malloc 中遇到负值。至少使用 unsigned int ;)
  • @BitTickler 是的,int i 很可能是问题所在。如果 wh 在 50K 范围内,即使是 32 位 int 也是不够的。我喜欢这些问题,就像拔牙一样才能获得真正重要的信息。
猜你喜欢
  • 1970-01-01
  • 2013-12-27
  • 2018-02-18
  • 2012-12-04
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多