为什么在初始化b2World时我必须使用new运算符? - Box2d

时间:2017-02-05 15:23:30

标签: c++ memory-management box2d

我到处寻找教程,我发现你必须像这样在box2d中设置一个世界:

b2World* world;
world = new b2World(b2Vec2(0.0f, -9));

为什么他们不只是这样做:

b2World world;
world = b2World(b2Vec2(0.0f, -9));

我的意思是,我没有看到这样做的好处 - 所以有人可以试着解释一下吗?谢谢!非常感谢您的时间:)

1 个答案:

答案 0 :(得分:0)

您不必使用新运营商。如您所述,您可以在堆栈上将其实例化为:

b2World world(b2Vec2(0, 10));

您是否看过b2World实例有多大?

尝试类似:

std::cout << sizeof(b2World) << std::endl;

我的大小为103,296字节!

对于许多系统,将103,296个字节放入堆栈是没有问题的。然而,并非所有系统都是如此。并且耗尽堆栈空间并不总是非常明显的情况。

在任何情况下,我发现b2World的大小令人惊讶地大(在我的Box2D的分支中,我重新设计了世界级的小得多)。所以这个问题归结为更普遍的问题,即将世界实例放在堆栈上还是将其放在堆上。

我发现以下问题和答案我认为可以提供进一步的指导:When is it best to use the stack instead of the heap and vice versa?第二高的投票答案是:

  

根据经验,避免在堆栈上创建大型对象。

虽然我不确定b2World实例的大小是为什么示例使用new(即使他们可以使用堆栈),但我怀疑它与它有很大关系。< / p>