繁体   English   中英

固定数组的大小,而不是在C中使用指针

[英]Fixing size of array as opposed to using a pointer in C

如果我有一个数组,而我所拥有的只是该数组可以达到的最大上限,并且如果要添加的元素数量可以大大小于此限制,那么声明指针和每当数组增长时重新分配额外的内存?

例如,除了声明int a[max]我还可以声明一个指针int *a ,而不仅仅是在添加元素时重新realloc 这样可以节省内存。 这样做有什么缺点吗?

在数组的每个追加上调用realloc可能太昂贵了。 您应该保留已分配的内存区域大小,并不时增加它。 如果oldsize是旧大小,则可以计算类似newsize = (5*oldsize/4+10)|0xf; 因为对于小尺寸,这将至少增加10个元素,对于大尺寸,您将不会损失超过25%的内存。

如果需要考虑速度,则可以对常见的小尺寸进行特殊处理,例如,通过声明一个本地数组int loc[8]; 对于大小小于等于8的小型数组,请使用loc而不是malloccalloc指针。 您也可以考虑使用alloca(3)在堆栈上分配一些数组(在当前台式机上不要在几十KB上使用alloca ),或使用VLA 您也可以考虑使用灵活的数组成员。

当然,您应该始终测试对malloccallocrealloc等的调用是否失败(以及通常使用的每个库函数)。 仔细阅读malloc(3)的文档

一些缺点:

  • 增加代码复杂度
  • 其他失败情况(重新realloc可能失败)
  • 可能的性能损失( realloc可能会很慢,如果数组有要被移动)

在大多数情况下,您必须检查并确定缺点是否大于使用较少资源的好处。 另一个优点是您不必事先知道最大数组大小。

您可能会节省内存,但是肯定会影响性能。

如果要存储元素,但不知道先验数量,为什么不使用链表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM