【问题标题】:Should I put large arrays on stack or heap?我应该将大型数组放在堆栈还是堆上?
【发布时间】:2015-07-26 04:54:25
【问题描述】:

我正在用 C 语言开发一个多线程应用程序。我目前正在使用 40 个线程,每个线程使用大约 2Mb 的数组。

我目前正在动态分配这个数组,所以我这样做了:

char *data = malloc(2097152 * sizeof(char));

这些线程正在处理请求,因此每次有新请求进来时,这个数组都会不断分配和释放。

一切正常,但我使用的是 valgrind 的 massif 工具,它显示我有时有一个 80Mb 的堆。所以我有点想知道,我会有堆碎片问题吗?我还在代码的其他地方分配了较小的内存块。

另外,我会从静态数组中受益吗?我正在寻找提高我的表现的方法,我想知道这是否会有所帮助。但是,我害怕这样做并最终导致堆栈溢出。堆栈中的 80Mb 似乎太大了...

有什么建议吗?我真的不知道堆/堆栈的大小太大了。

【问题讨论】:

  • 你怎么能得到一个 80 MB 的堆栈?无论如何,是的,你会有一些碎片,但设置一个 pool 数组将被重用的地方应该很容易......
  • 为什么在固定大小的情况下使用动态内存?这可能会让你慢很多
  • 当 40 个线程使用 2MB 每个加密到 80MB 时,为什么 80MB 的堆会成为问题?
  • 仅供参考,sizeof(char) 总是无处不在 1 ...见Are there machines, where sizeof(char) != 1?
  • 所以这个数组是不断分配和释放的,每次有新请求进来时为什么?为什么线程每次都不能使用相同的内存而不再次进行 malloc'ing?堆栈的主要问题是您不知道分配是否失败,并且还取决于您是否使用除此之外的更多堆栈存储。所以可能很危险。此外,大多数系统的默认堆栈大小为 8MB(当然可以更改)。所以 malloc'ing 可能是要走的路。

标签: c multithreading heap-memory stack-memory


【解决方案1】:

无论如何,您似乎正朝着这个方向前进,但是您可以使用一些设计模式来帮助您。

首先是内存池http://www.codeproject.com/Articles/27487/Why-to-use-memory-pool-and-how-to-implement-it 这可用于消除分配和取消分配内存的开销。

其次,为了完整起见,我假设您也在创建线程

所以线程池,如果你有一个访问内存池的线程池,你应该被排序。 http://en.wikipedia.org/wiki/Thread_pool_pattern

希望这可以帮助您解决问题。

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 2012-03-31
    • 2011-10-07
    • 2019-09-16
    • 1970-01-01
    • 2010-11-06
    • 2014-12-03
    • 2021-10-13
    • 2011-04-08
    相关资源
    最近更新 更多