恰好函数使用本地缓冲区来准备一些大小有限的数据块并将其传递给另一个函数,就像这样:
void foo()
{
char buffer[MAX_SIZE];
size_t size = write_fancy_things(buffer);
bar(buffer, size);
}
但是,根据 的值MAX_SIZE
,您可能会担心会吃掉太多的堆栈,并用类似于以下示例的代码替换代码(但希望更关心内存管理):
void foo()
{
static char *buffer = new char[MAX_SIZE];
size_t size = write_fancy_things(buffer);
bar(buffer, size);
}
在一般情况下,这两个函数的行为应该相同。但是,在第一个示例中,如果MAX_SIZE
太大,我们更有可能达到堆栈限制。如果您知道函数的使用位置,则使用较大的值可能会很好,但有时您不知道。
在第二个示例中,我们正在处理额外的间接性,缓冲区更容易出现 CPU 缓存未命中,如果foo
位于低延迟关键路径上,并且我们预计在大多数情况下准备缓冲区的成本非常低,则可能会出现这种情况.
您认为多大尺寸不能堆叠?将大块数据放在堆栈上但只使用其中的一小部分是否有任何惩罚?
编辑:这write_fancy _things
只是说*我正在将一些数据写入缓冲区的同义词,介于 1 和 MAX_SIZE 字节之间*。您可以将第二个foo
示例视为类方法,将静态指针视为在构造函数中分配的类成员。我可能只是过度简化了事情,但不想引入比需要更多的复杂性并专注于堆栈问题。