首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >malloc对realloc -最佳实践是什么?

malloc对realloc -最佳实践是什么?
EN

Stack Overflow用户
提问于 2021-12-27 10:09:46
回答 4查看 280关注 0票数 0

我有一个变量,其中大小是在运行时确定的。

通常情况下,每次添加新元素时都使用雷洛克更好,例如:

代码语言:javascript
复制
array_type * someArray;
int counter = 0;

//before a new element is added:
counter ++;
someArray = realloc(someArray, counter * sizeof(array_type));

或者分配比使用马洛一次可能需要的更多的内存:

代码语言:javascript
复制
array_type * someArray = malloc(ENOUG_MEMORY * sizeof(array_type));

efficiency(speed),、、可读性、memory-management?方面,什么是最好的?为什么?

EN

回答 4

Stack Overflow用户

发布于 2021-12-27 13:36:02

在过去,realloc有时是有用的,在单线程代码中使用某些分配模式。大多数现代内存管理器都是针对多线程程序和最小化碎片而优化的,因此,当增长分配时,realloc几乎肯定只分配一个新块,复制现有数据,然后释放旧块。因此,尝试使用realloc并没有真正的优势。

一次增加一个元素的大小会造成O(n^2)情况。在最坏的情况下,现有的数据必须每次复制。最好是增加块的大小(仍然是O(n^2),但使用较小的常数因子),或者按几何方式增长分配(这就给出了O(n)摊销成本)。

此外,很难正确使用realloc

代码语言:javascript
复制
someArray = realloc(someArray, counter * sizeof(array_type));

如果realloc失败,则someArray设置为NULL。如果这是指向以前分配的内存的指针的唯一副本,那么您刚刚丢失了它。您将无法访问您已经放置的数据,并且无法释放原始分配,因此您将有一个内存泄漏。

票数 2
EN

Stack Overflow用户

发布于 2021-12-27 14:25:55

在效率(速度)、可读性和内存管理方面,什么是最好的?为什么?

没有一般的最好的。具体的最佳取决于您的特定应用程序和用例和环境。您可以将战争抛在理想房地产比率之上,并决定如果你真的需要房地产

记住关于优化规则的事。你不能优化。然后,你不会优化,不首先测量。任何术语中的最佳值都可以用于特定设置、特定环境、使用特定操作系统的特定应用程序和*alloc实现。

什么是最佳做法?

分配一定数量的内存(如果足够小的话)是静态的。只是个数组而已。将应用程序重构为:

代码语言:javascript
复制
array_type someArray[ENOUGH_MEMORY];

如果您不想过多分配(或者ENOUGH_MEMORY足够大),那么使用realloc添加一个元素,如所示。

如果您想要“优化”,不要调用经常且过度分配的realloc --从上面的链接线程来看,比率1.5似乎是最可取的。尽管如此,它仍然是高度特定的应用程序--我会在Linux上过度分配,当我在STM32或其他裸金属上工作时不会这样做。

票数 2
EN

Stack Overflow用户

发布于 2021-12-27 14:15:13

我会谨慎地使用realloc。调用realloc通常会导致:

  1. 分配全新块
  2. 将所有数据从旧位置复制到新位置
  3. 释放(释放)初始块。

根据应用程序、数据量、响应要求,从性能角度来看,所有组合都可能是有问题的。

此外,在realloc失败的情况下,返回值为NULL,这意味着分配给新块并不简单(需要间接的)。例如。

代码语言:javascript
复制
    int *p = malloc(100 * sizeof *p);
    if (NULL == p) 
    {
        perror("malloc() failed");
        return EXIT_FAILURE;
    }
 
    do_something_with_p(p);

    /* Reallocate array to a new size
     * Using temporary pointer in case realloc() fails. */
    {
        int *temp = realloc(p, 100000 * sizeof *temp);

        if (NULL == temp)
        {
            perror("realloc() failed");
            free(p);
            return EXIT_FAILURE;
        }      

        p = temp;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70494094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档