【发布时间】:2011-10-07 03:52:16
【问题描述】:
函数使用本地缓冲区准备一些大小有限的数据块并将其传递给另一个函数,就像这样:
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正在使用“堆”吗? -
它正在使用堆。很糟糕。以一种几乎没有任何堆分配优势的方式。
-
@Tomalak 现在我不是;如果不是堆比什么?
-
@bdonlan 这就是重点,唯一的好处是我没有使用堆栈空间,我更喜欢堆栈空间,因为缓冲区是一个局部变量。所以我开始输入
char buffer[10000...,后面的每一个零都让我担心。 -
@tg:只是不要称它为堆。称它为动态分配的内存。它符合它的实际类型(自动/静态/动态/线程)。
标签: c++ heap-memory cpu-cache stack-memory