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

Is it too much to allocate 16kb on the stack?

本文关键字:太多 是不是 16kb 堆栈 分配      更新时间:2023-10-16

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

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

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

这个问题很难给出明确的是或否,因为答案高度依赖于您的环境以及在程序的哪个点调用分配内存的函数。

我个人认为,如果我在代码审查中看到这种情况,我会发出危险信号。对于基于堆栈的缓冲区来说,这是大量的内存。它可能今天在你使用它的特定地方起作用,但明天当你被调用时,你下面有一个更大的堆栈呢?或者当客户遇到一个你没有考虑到的场景时?

但就像我说的,这取决于场景,它可能只是适合你的特定场景。你的问题没有足够的细节来回答是或否

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

对于线程,如果你使用POSIX线程并且希望你的程序是可移植的,你可以使用pthread_attr_setstacksize接口来指定你的线程需要的堆栈空间的数量,然后只要你知道调用模式并且在选择大小时高估一个好的余量,你就可以确保它是安全的。

完全取决于您的操作系统和进程定义。最好通过malloc从堆中分配它,并检查结果(可能会失败)。在堆栈上分配失败可能会导致堆栈损坏,这将无法在运行时捕获。

如果您正在使用c++(因为问题有那个标签)使用vector<char> buffer(16384) -这样您可以自动回收,但大缓冲区被分配在堆上。

唯一潜在的缺点是缓冲区将被默认初始化。有一个小的机会,这可能是你负担不起的(尽管它可能不会造成什么后果)。

我认为这取决于缓冲区的预期生存期。

如果目的是让缓冲区只存在于创建函数和它调用的函数的作用域中,那么基于堆栈是避免内存泄漏的一种极好的机制。

如果我的目的是让缓冲区长时间存在,超过创建函数的作用域,那么我将malloc(3)缓冲区。

我的pthread_attr_setstacksize(3)说在pthread_create(3)中查看默认堆栈大小的详细信息;遗憾的是,我的系统上只有posix提供的pthread_create(3posix)手册页,它缺乏这些细节;但是我的记忆是,默认的堆栈大小是如此之大,以至于大多数想知道如何设置堆栈大小的人都想缩小,这样他们就可以在给定的内存中运行更多的线程。:)

如果你的代码没有被多个线程使用并且它不是可重入的…那么我就会在程序初始化时对这个缓冲区执行一个malloc。您将不必担心围绕堆栈大小的体系结构问题。您肯定不想在每次调用时使用malloc/free。