【问题标题】:Increasing the stack size: typical issues? [closed]增加堆栈大小:典型问题? [关闭]
【发布时间】:2014-11-05 18:45:33
【问题描述】:

我正在为游戏和实时应用程序编写一个通用框架,使用 gcc 编译。为了提高效率,我希望核心框架结构的所有实例都分配在堆栈上。

根据使用框架构建的项目的大小,似乎在某些情况下堆栈大小可能需要从典型的默认值(1-2 MB?)增加。

可以在 gcc 支持的所有平台上更改堆栈大小吗?操作系统中是否存在阻止堆栈大小增加的硬限制?增加堆栈大小(包括使用多线程时)是否还面临其他典型问题?

【问题讨论】:

  • 如果你有超过 2 Mb 的数据结构,你可能会在静态内存中分配一些,如果不是大部分的话,非常大的东西通常不会继续堆栈。
  • 从内存访问的角度来看,没有什么可以使堆栈“更快”;分配和取消分配很便宜,因为 allocate 是“增量指针”,而 deallocate 是“减量指针”。对于您分配一次并跨框架重复使用的东西,这样做对您没有任何好处。
  • @BillyONEal 也完全正确。重新阅读您自己的链接,它明确表示在答案中堆栈内存访问没有没有速度优势。
  • 您误读了这些答案。堆栈内存和堆内存完全相同同步问题,后分配(这些答案只是说 malloc 本身必须是原子的,不是内存读取)。要么您不共享内存,在这种情况下没有问题,或者您正在共享内存,在这种情况下您还必须同步堆栈。这不是魔术。如果您是批量分配,连续性也不是问题。
  • 伙计们,OP 是对的,这里不适合讨论。发布问题/去聊天/等等。

标签: c gcc memory-management


【解决方案1】:

(由于到目前为止我的问题缺乏答案,我在研究这个问题时发现了一些值得注意的点......)

gcc 可以为相关可执行文件设置堆栈大小,但仅限于 Windows 可执行文件,不能 *nix / ELF 二进制文件。显然,MSVC 可以对 Windows 可执行文件执行相同的操作。

在*nix 下,需要使用ulimit -s <sizeMB> 设置堆栈大小,这适用于此后运行的所有可执行文件,而不是像Windows 那样特定于某个可执行文件。或者在创建 POSIX 线程之前,pthread_attr_setstacksize() 可用于为这些线程设置默认堆栈大小。在其他人分享他们的经验之前,我只能假设对于 *nix 的所有(游戏)平台,包括 Android、MacOS、iOS、PlayStation(所有),上述内容都适用。

除了系统特定的硬件限制之外,堆栈大小不应有上限;特别是在 *nix 下,ulimit -s unlimited 可以设置动态的、理论上无限的运行时堆栈大小。

尽管如此,我还是让评论者提醒我注意相关问题或不正确的假设

【讨论】:

    猜你喜欢
    • 2015-11-22
    • 2010-11-24
    • 1970-01-01
    • 2013-12-24
    • 2011-09-29
    • 2012-02-10
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多