【问题标题】:Malloc vs static array in C [duplicate]C中的Malloc与静态数组[重复]
【发布时间】:2015-04-16 20:24:08
【问题描述】:

通常说在运行时知道大小时使用 malloc,我们也可以编写

int x;
scanf("%d",&x);
char arr[x];

既然我们可以动态声明数组,为什么还要使用 malloc。

【问题讨论】:

  • @YassineHoussni 呃,巨大的断言。 “它更快”的说法甚至是错误的。动态内存分配是最慢的“原始”操作之一。通常,声明一个 VLA 几乎可以立即使用内存(它只是需要添加/减去某个数字的堆栈指针),这与 malloc() 不同,它涉及通过免费存储进行搜索(可能并且经常使用具有大容量的复杂数据结构来实现)常数因子)。
  • 有人还应该记住,malloc() 需要 free() VLA 不需要,这对于大型数组尤其重要。

标签: c arrays dynamic static malloc


【解决方案1】:

char arr[x];会在栈上分配内存。

堆栈的大小通常限制在 1MB 左右。如果超出此预定义数量,您将收到运行时错误。一些编译器允许您更改堆栈大小,但您最终仍会达到比malloc 所能达到的多个数量级的限制。

【讨论】:

  • 所以需要的内存大小和数据的范围决定何时使用静态或动态。还有其他原因吗?
  • 我认为堆栈通常不会那么小,并且所有答案都缺乏关于使用free() 的任何建议,在使用malloc() 的情况下,只是因为堆栈不适合数据的大小,真的很重要。
  • @iharob: msdn.microsoft.com/en-us/library/windows/desktop/… 在 Windows 上默认为 1 MB(请求的大小存储在可执行文件中),在我的 Linux 64 位机器上默认为 8 MB(根据 ulimit -s)。我不会尝试在其上加载图像或任何大的东西(特别是因为堆栈溢出在 Windows 上特别讨厌,这个过程就消失了)。
  • @MatteoItalia 我有一个解决方案,如果您知道它将是大量数据,请不要将数据加载到堆栈上,也不要使用 Windows。但是,如果已知您的数据不会超过堆栈大小,则出于性能原因和简单性考虑,您应该避免使用malloc()。 > 8MB 的图像是相当大的图像,不是吗?除了游戏和图像编辑/查看软件之外,它并不常见。
  • @iharob:这正是重点;堆栈分配适用于较小的缓冲区(通常为几 KB),但在处理来自外部的数据时必须小心。在这些情况下,即使没有 VLA,通常也会有一个小的堆栈分配缓冲区,并在内容变大时回退到 malloc
【解决方案2】:

VLA [可变长度数组] 是C99 以后出现的概念。

malloc() 早在此之前就起源了。

另外,malloc() 和家族从堆中分配内存。它不使用相对有限的堆栈空间。

OTOH,gcc 在堆栈本身中为VLAs 分配空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2018-07-29
    • 2018-10-01
    • 2019-07-06
    相关资源
    最近更新 更多