我一直在寻找在C++中在堆栈或堆上分配对象的经验法则。我在这里找到了很多关于SO的讨论。许多人说,这与物体的生命周期有关。如果您需要的生存期超出函数范围,则将其放入堆中。那是很合理的。
但是,很多人说,令我感到困惑的是,如果对象很小,则会将它们分配到堆栈中。如果对象很大,则将其堆放。但是他们都没有说如何识别一个物体是大还是小?
我有以下问题,
vector<string>
的包装器类。它将有大约100个项目。如果将此类分配给堆栈,是否会使堆栈溢出?我试过了,但是效果很好。不知道我做错了什么。 最佳答案
首先, vector (以及所有STL容器类)总是从堆中分配,因此您不必为此担心。对于任何大小可变的容器,几乎不可能使用堆栈。
如果考虑堆栈分配的工作方式(在编译时,基本上是通过为每个对象增加一个指针),那么应该清楚 vector 存储器来自堆。
std::vector<int> myInts;
std::string myString;
SomeOther Class;
// this memory must come from the heap, there's no way it
// can now be allocated on the stack since there are other
// objects and these parameters could be variable
myString = "Some String";
myInts.reserve(256);
除非您具有递归功能,否则无需担心就可以在堆栈中放置几千字节的数据。堆栈大小由程序(而不是操作系统)控制,默认大小范围为32kb-1mb。大多数桌面软件的速度都在1mb范围内。
单个对象几乎不再是一个问题。通常,它们要么对于堆栈足够小,要么将从堆内部进行分配。
如果对象是函数的局部对象,则将它们放在堆栈中。如果不把它们放到堆上。
将堆用于您分配用于装入/排序/处理数据的大型缓冲区。
关于c++ - 如何识别对象是否应该在堆栈上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/617513/