gpt4 book ai didi

c++ - 什么时候应该在堆栈而不是堆上分配一个类

转载 作者:可可西里 更新时间:2023-11-01 15:18:16 25 4
gpt4 key购买 nike

过去,每当我需要创建一个类的实例时,我都会使用 new 在堆上分配它(除了 STL 类,以及 vec3 和 mat4 等数学类)。

但是,我只是批判性地审视了我的一些代码,并意识到从技术上讲,我可以将这些类放在堆栈上。它们不是很大,不需要在当前范围之外进行修改等。当我(偶尔)需要将它们传递给另一个函数时,我可以像传递指针一样轻松地使用引用。

过去我总是默认在堆上分配,并且只在某些情况下使用堆栈,但是现在我想知道是否默认在堆栈上分配更好,并且只在某些情况下使用堆

  • 确实需要一个指针(即对象的生命周期要超过声明的范围)
  • 类或数组对于堆栈来说太大了
  • 继承需要它(抽象基类/接口(interface))
  • 还有别的吗?

这也提出了一个问题:一个类有多大(粗略地)太大而无法在堆栈上合理分配? (假设我们至少在智能手机上工作,然后升级到高端台式机)我只是在不必要地担心堆栈大小限制吗? (可能,只要我们不是在谈论大型数组,并且没有类会接近千字节)

最佳答案

你的默认行为应该是:

如果对象的生命周期与特定范围一致
即在编译时很容易确定

then it should be an automatic storage duration object (stack like)

如果对象的生命周期是在运行时定义的并且超出了当前范围

Then it should be a a dynamic storage duration object (heap like)

注意:所有动态存储持续时间对象都应通过将它们包装在适当的 RAII 类中来控制其生命周期。通常这意味着:对于单个对象一个智能指针,而多个对象最终在一个容器中。

讨厌看到定义为堆栈与堆的东西。因为它没有传达情况的真实语义。

 int x;       // its on the stack
struct X
{
int x; // Is this a stack or heap object?
} // It depends on its parent.


// But in both cases it is an automatic storage duration object.
// In both cases the lifespan's are well defined.
// The first is defined by the scope it is declared within.
// The second is defined by the lifespan of its parent.

您应该考虑自动/动态“存储持续时间”对象。这传达了语言的正确语义。

请注意,还有另外两种类型的变量,因此有四种不同类型的变量。自动/动态/静态/线程“存储持续时间”对象。

关于c++ - 什么时候应该在堆栈而不是堆上分配一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333062/

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