有时候函数使用本地缓冲区来准备一些有限大小的数据块,并将其传递给其他函数,就像这样:
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
示例视为类方法,并将静态指针视为在构造函数中分配的类成员。我可能只是过分简化了事情,但不想引入比需要更复杂的内容并关注堆栈方面的问题。
new
是在使用“堆”吗? - Lightness Races in Orbitchar buffer[10000...]
,每个后续的零都让我感到担忧。 - tomasz