我一直在寻找在C++中在堆栈或堆上分配对象的经验法则.我在这里找到了许多关于SO的讨论.很多人说,这是关于物体的寿命.如果您需要比函数范围更长的生命周期,请将其放入堆中.这很有道理.
但令我困惑的是,许多人说,如果它们很小,就会将对象分配给堆栈.如果对象很大,请将其放入堆中.但他们都没有说如何识别物体是否很大?
我有以下问题,
如何识别对象是否很大?
堆栈最大大小是多少?每个OS都有不同的堆栈大小?
我有一个包装的包装类vector
.它将有大约100件物品.如果我将这个类分配给堆栈,它是否会导致堆栈溢出?我试过这个,但效果很好.不确定我做错了什么.
Andrew Grant.. 10
首先,向量(以及所有STL容器类)总是从堆中分配,因此您不必担心这一点.对于任何具有可变大小的容器,使用堆栈几乎是不可能的.
如果你考虑堆栈分配是如何工作的(在编译时,基本上通过递增每个对象的指针),那么应该清楚向量内存来自堆.
std::vectormyInts; 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);
除非您处于递归函数中,否则可以在堆栈上放置几千字节的数据而不必担心.堆栈大小由程序(不是OS)控制,默认值范围为32kb - 1mb.大多数桌面软件都在1mb范围内.
单个对象几乎从不关注.通常,它们要么足够小,要么堆栈,或者从堆内部分配.
如果对象是函数的本地对象,则将它们放在堆栈中.如果不把它们放在堆上.
将堆用于分配用于加载/排序/操作数据的大缓冲区.
首先,向量(以及所有STL容器类)总是从堆中分配,因此您不必担心这一点.对于任何具有可变大小的容器,使用堆栈几乎是不可能的.
如果你考虑堆栈分配是如何工作的(在编译时,基本上通过递增每个对象的指针),那么应该清楚向量内存来自堆.
std::vectormyInts; 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);
除非您处于递归函数中,否则可以在堆栈上放置几千字节的数据而不必担心.堆栈大小由程序(不是OS)控制,默认值范围为32kb - 1mb.大多数桌面软件都在1mb范围内.
单个对象几乎从不关注.通常,它们要么足够小,要么堆栈,或者从堆内部分配.
如果对象是函数的本地对象,则将它们放在堆栈中.如果不把它们放在堆上.
将堆用于分配用于加载/排序/操作数据的大缓冲区.