我可以使用std :: realloc来防止冗余内存分配吗?

时间:2014-09-12 11:17:13

标签: c++ memory-management realloc

每次迭代我需要为临时数组分配一次空间。我尝试使用realloc每次迭代来优化内存使用。像那样:

int *a = (int*)std::alloc(2 * sizeof(int));
for(int i=0; i<N; ++i) 
{
    int m = calculate_enough_size();
    a = (int*)std::realloc(m * sizeof(int));
    // ...
}
std::free(a);

N是一个很大的数字,例如1000000。每次迭代都有示例m值:8,2,6,10,4,8

当我在每次迭代时重新分配a时,我做得对吗?它是否会阻止冗余内存分配?

3 个答案:

答案 0 :(得分:3)

首先,realloc需要2个参数。第一个是原始指针,第二个是新大小。您试图将大小作为原始指针传递,代码不应该编译。

其次,强制性提醒:不要过早优化。除非您已经测量并发现分配是瓶颈,否则只需使用std::vector

答案 1 :(得分:1)

我注意到的几个问题是:

  • 如果您希望将较旧的值保留在内存中,则应使用Realloc,如果您没有按照其中一条注释中使用的仅使用alloc中提到的旧值进行打扰。

  • 请在重新分配之前检查已分配内存的大小,如果分配的内存不足以分配新数据,则只分配新内存。

请参阅将解决上述问题的示例代码:

int size = 2;   
int *a = (int*)std::alloc(size  * sizeof(int));

for(int i=0; i<N; ++i) 
{
   int m = calculate_enough_size();
   if(m > size)
   {
       size = m;
       std::free(a);
       a = (int*)std::alloc(size * sizeof(int));
   }
   // ...
}
std::free(a);

您还可以通过分配一些额外的内存来进一步优化内存分配,例如:

size = m*2; //!

为了更好地理解这一步骤,我们假设 m = 8 ,然后你将分配内存= 16 ,所以现在 m更改为10,12直到16 ,无需再次分配内存。

答案 2 :(得分:0)

如果您事先可以获得所有尺寸,请在周期之前分配您需要的最大尺寸,然后根据需要使用。

另一方面,如果你不能这样做,那么我认为重新分配是一个很好的解决方案。

您还可以通过仅在需要更大尺寸时重新分配来进一步优化您的解决方案:

int size = 0;
for(int i = 0; i < N; ++i) 
{
    int new_size = calculate_enough_size();
    if ( new_size > size ){
        a = (int*)std::realloc(new_size * sizeof(int));
        size = new_size;
    }

    // ...
}

像这样你需要更少的重新分配(其中一半是随机的)。