【问题标题】:Does malloc() offer benefits compared to global arrays for fixed array sizes?与固定数组大小的全局数组相比,malloc() 是否提供好处?
【发布时间】:2021-06-22 10:22:47
【问题描述】:

我目前正在编写一个需要 100MB 缓冲区大小来发送数据的套接字程序。此缓冲区大小将始终为固定大小并持续整个程序的持续时间。

与仅仅声明一个全局数组相比,使用 malloc() 有什么好处吗?

注意:我能想到的唯一好处是 malloc() 会告诉你内存分配是否失败,而不是全局数组,当你请求太多内存时可能会导致未定义的行为。

【问题讨论】:

  • 据我所知,全局数组不会有未定义的行为。该程序将无法启动。或者,如果在启用内存过量使用的 Linux 中运行,它可能会因 OOM 意外而被终止。但这也不是未定义的。
  • 如果静态数组太大,编译器告诉我,就没有可执行文件了。
  • 它是依赖于实现的,但我认为任何好的实现都不会让你用太大的静态缓冲区进行编译。
  • 取决于“太大”的含义;您当然可以使用适合架构提供的地址空间的数组来编译程序,但由于实际上没有那么多内存,因此无法在您的系统上运行。
  • 我会选择动态分配,因为它可以保证程序的编译,并且只会在有特定限制的系统上失败,但在其他系统上也可以。

标签: c memory-management static malloc heap-memory


【解决方案1】:

使用 malloc() 与仅声明一个全局数组相比有什么好处吗?

使用全局数组,初始化整个 100MB 数组,默​​认为 0,在程序启动时 - 这可能需要一些时间。

使用malloc(),不需要这样的初始化。

可以想象,这意味着malloc() 方法启动速度更快。

这种差异可能是一种优势。

【讨论】:

  • 在典型系统上,全局数据启动时的零初始化是零成本。 (或者至少比malloc 电话便宜)
  • @HAL9000 同意程序空间成本为零,但执行时间成本肯定不为零。
  • @chux-ReinstateMonica 为安全起见,分配给程序的所有空间都初始化为 0。使用 malloc,您必须再次对其进行 0 初始化,因为您不确定。
  • @user253751 "使用 malloc,您必须再次对其进行 0 初始化,因为您不确定。"不,OP 对缓冲区的使用没有强制归零要求。 OP 的代码可以直接写入分配的缓冲区而无需事先清零。 C 也没有根据“分配给您的程序的所有空间都为安全性初始化为 0”来强加 security 要求。缺少显式初始化的全局变量按规范归零。这发生在main() 被调用之前并且需要时间。
  • @chux,假设您有一个 mmu 和一个健全的操作系统,启动时的所有全局数据都可以通过“fork-on-write”映射到单个零值页面。这基本上是一个单一的mmap 电话。当您调用malloc(假设您需要更多虚拟内存)时,malloc 还将执行mmap,出于安全考虑,它将使用“fork-on-write”技巧执行相同的零值页面。只是你有更多的记录保存开销。在嵌入式系统上,事情就更简单了。开机时内存为零。自然有个例外,比如MS-DOS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2017-02-11
  • 2018-02-27
  • 2016-09-09
  • 1970-01-01
  • 2018-01-30
相关资源
最近更新 更多