【问题标题】:Fixing size of array as opposed to using a pointer in C固定数组的大小,而不是在 C 中使用指针
【发布时间】:2014-10-15 06:35:29
【问题描述】:

如果我有一个数组,而我所拥有的只是数组可以达到的上限,并且如果添加的元素数量可以大大小于这个限制,那么声明一个数组是否总是正确的选择?指针并在数组增长时重新分配额外的内存?

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

【问题讨论】:

  • 如果 realloc 失败了怎么办?在下定决心之前,您应该根据实际应用分析目标性能。
  • @MohitJain。哦,我明白了,我没想到失败。
  • "这样可以节省内存。这样做有什么缺点吗?" - 当然;有一个时间/空间的权衡。
  • Unknown size of int array的可能重复

标签: c arrays pointers


【解决方案1】:

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

如果速度是一个问题,您可以特殊情况下常见的小尺寸,例如通过声明一个 local 数组 int loc[8]; 并使用 loc 而不是 malloc-ed 或 calloc-ed 指针用于大小 alloca(3) 在堆栈上分配一些small 数组(不要在当前桌面上超过几十千字节的空间上使用alloca),或者使用VLAs。您也可以考虑灵活的数组成员。

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

【讨论】:

    【解决方案2】:

    一些缺点:

    • 增加代码复杂度
    • 其他失败案例(realloc 可能失败)
    • 可能的性能损失(如果必须移动阵列,realloc 可能会很慢)

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

    【讨论】:

    • 我知道可能的性能损失,但总是想当然地认为调用会成功。
    • @Zaphod 除非您在高度内存受限的环境中工作或者您的最大大小很大,否则可以合理地假设 realloc 会成功(如果没有成功则退出程序)。 .. 毕竟,您假设静态数组分配会成功,但这也可能会失败(在这种情况下,您的程序将不会加载)。
    【解决方案3】:

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

    如果你想存储元素但你不知道先验多少,为什么不使用linked list

    【讨论】:

    • 这对于添加 (+ realloc) 可能更有效,但对列表的访问通常要慢得多。当然,取决于使用情况。
    • 这取决于您打算如何处理它(我们这里没有线索)。但至少从内存管理 POV 来看,它更简单。
    • OP 写了“我有一个数组”。链表不是数组,可互换的用例并不多。
    • 将数组重新分配到新的大小比将节点添加到链表更简单,并且内存效率更高。
    • 也许 OP 有一个数组,因为他没有考虑替代方案,这就是我建议链表的原因。由于我们不知道 OP 将如何使用它,因此很难在不基于意见的情况下对数据结构中添加/删除/移动元素的可互换性和效率做出任何假设。
    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 2015-05-24
    • 2011-12-04
    • 1970-01-01
    • 2014-11-10
    • 2011-09-17
    • 2011-11-28
    相关资源
    最近更新 更多