我一直在寻找在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/

    10-11 22:13
    查看更多