我需要在调用c函数之前实例化char [16384]缓冲区。函数返回后,我将读取它的某些部分并将其丢弃。
可以在堆栈上分配它还是应该使用堆?
编辑:我会添加一些信息。代码将在几个平台上运行,从PC到iPhone,我猜堆栈空间不会那么大,但我不知道。
答案 0 :(得分:15)
很难对这个问题给出肯定的肯定或否定,因为答案高度依赖于您的环境,并且在程序的哪个阶段调用分配内存的函数。
就个人而言,如果我在代码审查中看到这一点,我会举起一面红旗。这是用于基于堆栈的缓冲区的大量内存。今天它可能在你正在使用它的非常具体的地方工作但是明天当你用一个比你更大的堆栈调用时呢?或者当客户遇到您未考虑的情景时?
但就像我说它依赖于场景而言,对于您的特定场景可能会很好。你的问题根本没有足够的细节说是或否
答案 1 :(得分:5)
除非你是为嵌入式系统编程,可能是从主线程以外的线程运行的代码,或者是递归调用的代码,否则我会说16k在你可以在堆栈上分配的合理大小内。
对于线程,如果你正在使用POSIX线程并希望你的程序是可移植的,你可以使用pthread_attr_setstacksize
接口来指定线程所需的堆栈空间量,然后只要你知道在选择大小时,调用模式和高估的高估,你可以确定它是安全的。
答案 2 :(得分:2)
完全取决于您的操作系统和流程定义。最好通过malloc
从堆中分配它并检查结果(可能会失败)。在堆栈上分配故障可能会导致堆栈损坏,您无法在运行时捕获它。
答案 3 :(得分:2)
如果您正在使用C ++(因为问题有该标记),请使用vector<char> buffer(16384)
- 这样您就可以自动释放,但是大堆缓冲区会在堆上分配。
唯一可能的缺点是缓冲区将被默认初始化。这可能是你买不起的东西(尽管它可能没有任何后果)。
答案 4 :(得分:1)
我会说这取决于缓冲区的预期寿命。
如果目的是缓冲区仅存在于创建函数及其调用的函数的范围内,那么基于堆栈是避免内存泄漏的绝佳机制。
如果缓冲的目的是长寿,比创建函数的范围更长,那么我会malloc(3)
缓冲区。
我的pthread_attr_setstacksize(3)
说要查看pthread_create(3)
有关默认堆栈大小的详细信息;遗憾的是,我在系统上的所有内容都是POSIX提供的pthread_create(3posix)
联机帮助页,缺少这些细节;但我的回忆是,默认的堆栈大小是如此之大,以至于大多数想知道如何设置堆栈大小的人都希望收缩它,因此他们可以在给定的内存量中运行更多的线程。 :)
答案 5 :(得分:0)
如果您的代码没有被多个线程使用并且它不可重入...那么我只会在程序初始化时为该缓冲区执行一个malloc。对于堆栈大小的架构问题,您将不再担心。你绝对不希望每次通话都能使用malloc / free。