我有一个变量,其中大小是在运行时确定的。
通常情况下,每次添加新元素时都使用雷洛克更好,例如:
array_type * someArray;
int counter = 0;
//before a new element is added:
counter ++;
someArray = realloc(someArray, counter * sizeof(array_type));或者分配比使用马洛一次可能需要的更多的内存:
array_type * someArray = malloc(ENOUG_MEMORY * sizeof(array_type));在efficiency(speed),、、可读性、和memory-management?方面,什么是最好的?为什么?
发布于 2021-12-27 13:36:02
在过去,realloc有时是有用的,在单线程代码中使用某些分配模式。大多数现代内存管理器都是针对多线程程序和最小化碎片而优化的,因此,当增长分配时,realloc几乎肯定只分配一个新块,复制现有数据,然后释放旧块。因此,尝试使用realloc并没有真正的优势。
一次增加一个元素的大小会造成O(n^2)情况。在最坏的情况下,现有的数据必须每次复制。最好是增加块的大小(仍然是O(n^2),但使用较小的常数因子),或者按几何方式增长分配(这就给出了O(n)摊销成本)。
此外,很难正确使用realloc。
someArray = realloc(someArray, counter * sizeof(array_type));如果realloc失败,则someArray设置为NULL。如果这是指向以前分配的内存的指针的唯一副本,那么您刚刚丢失了它。您将无法访问您已经放置的数据,并且无法释放原始分配,因此您将有一个内存泄漏。
发布于 2021-12-27 14:25:55
在效率(速度)、可读性和内存管理方面,什么是最好的?为什么?
没有一般的最好的。具体的最佳取决于您的特定应用程序和用例和环境。您可以将战争抛在理想房地产比率之上,并决定如果你真的需要房地产。
记住关于优化规则的事。你不能优化。然后,你不会优化,不首先测量。任何术语中的最佳值都可以用于特定设置、特定环境、使用特定操作系统的特定应用程序和*alloc实现。
什么是最佳做法?
分配一定数量的内存(如果足够小的话)是静态的。只是个数组而已。将应用程序重构为:
array_type someArray[ENOUGH_MEMORY];如果您不想过多分配(或者ENOUGH_MEMORY足够大),那么使用realloc添加一个元素,如所示。
如果您想要“优化”,不要调用经常且过度分配的realloc --从上面的链接线程来看,比率1.5似乎是最可取的。尽管如此,它仍然是高度特定的应用程序--我会在Linux上过度分配,当我在STM32或其他裸金属上工作时不会这样做。
发布于 2021-12-27 14:15:13
我会谨慎地使用realloc。调用realloc通常会导致:
根据应用程序、数据量、响应要求,从性能角度来看,所有组合都可能是有问题的。
此外,在realloc失败的情况下,返回值为NULL,这意味着分配给新块并不简单(需要间接的)。例如。
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;
}https://stackoverflow.com/questions/70494094
复制相似问题