在堆栈上分配16kb是不是太多了?
Is it too much to allocate 16kb on the stack?
我需要在调用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。
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在枚举类型上使用std::max是不是一种糟糕的做法
- std::元组大小,是不是错过了优化?
- OCCI 异常:连接描述符太长(但不是真的)
- 拥有相同方法的静态和非静态版本是不是设计不好
- 他是不是很贪婪
- SDL2:移动所有东西而不是使用视图端口是不是很糟糕
- OOP-我是不是把事情复杂化了
- 在DLL中分配内存并将其指针提供给客户端应用程序,这是不是一种糟糕的做法
- MYSQL连接太多错误不会消失
- 在C++代码中使用C风格的注释是不是一种糟糕的做法
- 这个简单但有用的模式是不是太简单了,不可能成为一个真正的模式
- 标准池:wstring.是不是这种做法太幼稚了
- 我是不是太快了,数不清妖孽
- 如果一个程序的主要功能是从磁盘中读取数据,那么让它多线程是不是一个好主意?
- 我是不是对单身人士太过分了?
- 使用Windows和c++的chrono为每个人安排一个1毫秒的事件——我是不是要求太多了?
- if语句是不是太复杂了?
- 在堆栈上分配16kb是不是太多了?