在堆栈上分配16kb太多了吗?

Dam*_*ian 10 c c++ stack memory-management

我需要在调用ac函数之前实例化一个char [16384]缓冲区.函数返回后,我将读取它的某些部分并将其丢弃.

可以在堆栈上分配它还是应该使用堆?

编辑:我会添加一些信息.代码将在几个平台上运行,从PC到iPhone,我猜堆栈空间不会那么大,但我不知道.

Jar*_*Par 15

很难对这个问题给出肯定的肯定或否定,因为答案高度依赖于您的环境,并且在程序的哪个阶段调用分配内存的函数.

就个人而言,如果我在代码审查中看到这一点,我会举起一面红旗.这是用于基于堆栈的缓冲区的大量内存.今天它可能在你正在使用它的非常具体的地方工作但是明天当你用一个比你更大的堆栈调用时呢?或者当客户遇到您未考虑的情景时?

但就像我说它依赖于场景一样,它可能适合您的特定场景.你的问题根本没有足够的细节说是或否

  • 除非你能够容忍`malloc`失败,否则堆栈上的分配可能会更加可靠*.除非你使用递归(Considered Harmful,至少超出'O(log n)`),静态分析可以确定程序所需的堆栈空间总量,并证明你永远不会有堆栈溢出.另一方面,`malloc`可能在很多条件下失败,大多数条件在大多数程序中都是数据依赖的,不能排除.当需要一个小的有界缓冲区时,我会使用堆栈分配,只要你能确定它是安全的. (4认同)
  • @R ..:这有点像说在人行道上骑自行车实际上比在路上更安全.随着所有自行车运动员随后使用人行道,这种自我毁灭//静态分析变得不那么有用多态,第一类函数对象和元编程/运行时代码生成等.上次我检查静态分析c ++停止或多或少在'太难了可靠地解析'阶段(即除非在IDE中非常紧密地集成,否则几乎不可能确信实际的预处理分析源与编译源匹配). (3认同)

R..*_*R.. 5

除非你是为嵌入式系统编程,可能是从主线程以外的线程运行的代码,或者是递归调用的代码,否则我会说16k在你可以在堆栈上分配的合理大小内.

至于线程,如果你正在使用POSIX线程并希望你的程序是可移植的,你可以使用pthread_attr_setstacksize接口来指定你的线程所需的堆栈空间量,然后只要你知道调用模式和高估选择尺寸的好处,你可以肯定它是安全的.