gpt4 book ai didi

c++ - 如何确定一个对象是否应该在堆栈上?

转载 作者:可可西里 更新时间:2023-11-01 18:08:45 27 4
gpt4 key购买 nike

我一直在寻找在 C++ 中的堆栈或堆上分配对象的经验法则。我在这里找到了很多关于 SO 的讨论。很多人说,这是关于一个对象的生命周期。如果您需要比函数范围更长的生命周期,请将其放入堆中。这是完全有道理的。

但是让我感到困惑的是,很多人说,如果对象很小,就分配给堆栈。如果对象很大,就把它放到堆中。但是他们都没有说如何识别一个物体是大还是小?

我有以下问题,

  1. 如何判断一个物体的大小?
  2. 堆栈的最大大小是多少?每个操作系统都有不同的堆栈大小?
  3. 我有一个包装器类,它包装了 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com