【问题标题】:Objects on a stack vs Objects on a heap in C++ [duplicate]C ++中堆栈上的对象与堆上的对象[重复]
【发布时间】:2016-02-04 07:01:03
【问题描述】:

我是 C++ 的新手,发现在 C++ 中,你有 2 种方法来创建对象:堆栈上的对象和堆上的对象。

但我很想知道在堆栈上使用对象与在堆上使用对象的优缺点是什么。

在什么情况下,第一种方法优于第二种方法,反之亦然?

【问题讨论】:

标签: c++


【解决方案1】:

堆栈几乎总是更可取的。您的对象可能管理堆上的数据,例如std::string,在这种情况下,对象本身保存在堆栈上(与任何其他局部变量一样),而字符串数据保存在堆上。

堆栈速度很快。堆很慢。 堆栈用于小数据。堆用于大数据。

希望这会有所帮助。

【讨论】:

  • 好吧,如果对象的生命周期必须超过创建它的函数的生命周期,并且它不能被复制或移动,那么它有多大并不重要。
  • 任何对象都是如此,无论是简单的还是复合的。
  • 请不要散布神话。
  • 请问? (什么神话?)
【解决方案2】:

堆栈上的对象具有非常简洁的特性,即支持它们的内存在堆栈帧结束时(例如,当函数返回时)自动释放。C++ 通过 also 调用扩展了这个概念所有堆栈对象的析构函数每当超出范围(即在函数返回之前抛出异常的情况下它们仍然被释放。)因为这使得内存管理变得非常简单,并且内存管理错误具有易于制造和难以检测的令人沮丧的组合,在可行的情况下应首选堆栈分配。

堆栈分配对象的缺点是......嗯......当函数返回时它们会被删除。有时有正当理由希望对象寿命更长。在这些情况下,您别无选择,只能从堆中分配。

要考虑的另一点是堆栈分配几乎必须是编译软件时已知的大小(但请参阅某些平台上可用的 alloca 函数。)有很多在程序运行之前您不会知道您需要多少内存的真实世界场景。以地址簿应用程序为例。如果我正在编写这样一个应用程序,我显然不知道最终用户想要在他们的通讯录中加入多少人。用户必须告诉程序这个信息。在这种情况下,您需要动态分配内存,因此您再次查看堆分配。

【讨论】:

  • 请不要散布神话。
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多