是否为子系统创建动态分配或自动建议?

时间:2011-02-22 01:22:50

标签: c++ performance stack heap

我是一名业余爱好者C ++程序员,目前正在开发游戏(使用Ogre3D),我对主要类的内存分配有疑问。

我已经阅读了很多内存分配,在堆栈上自动分配并在堆上动态分配,以及它们的差异(性能,有限的堆栈大小)。我仍然不确定我的主类(Application)和其他一些'工厂'类(由Application类的单个实例创建)使用什么,在整个执行过程中都会有一个实例存在。

以下是布局的简化摘录:

int main() 
{
    // like this (automatic)
    Application app;
    app.create();    // initializing
    app.run();       // runs the game-loop

    // or like this (dynamic)
    Application* app;
    app = new Application();
    app->create();
    app->run();

    return(0);       // only reached after exiting game
}



class Application
{
public:
    Application();   // ctor
    ~Application();  // dtor

    // like this, using 'new' in ctor and 'delete' in dtor (dynamic)
    SceneManager* sceneManager_;   // a factory for handling scene objects
    DebugManager* debugManager_;   // a factory for handling debugging objects

    // or like this (automatic)
    SceneManager sceneManager_;
    DebugManager debugManager_;
};

在堆栈或堆上分配内存(Application类和工厂类)是否更好?通过什么论证?

提前致谢!

3 个答案:

答案 0 :(得分:4)

始终更喜欢动态分配的自动分配。当您需要动态分配时,请确保其生命周期由自动分配的资源包装器管理,如智能指针。

答案 1 :(得分:0)

在这种情况下,我认为这一切都取决于规模。

您不想浪费堆栈空间,因此要么使用new进行动态分配,要么将Application作为main()之外的全局变量。

答案 2 :(得分:0)

在C ++中,问题相当复杂,但总的来说,你无法避免在堆上进行分配。例如,您的new操作是在堆上分配Application对象 - new在运行时动态分配内存,auto内存的分配是在编译时确定。 (当然,它实际上是在运行时分配 - 但它是在启动代码根据编译的分配为main创建堆栈时分配的。)

现在,为什么希望避免在堆上分配?这可能是因为堆大小有限,但现代机器很少出现问题,即使在手持设备中也是如此。但是,堆栈空间可能会受到限制。因此争论堆。

当然,auto内存不会“泄漏” - 但是在主(或文件范围内,虽然那是静态的)中分配的内存不会被释放,因此人们几乎可以“自动地”声明它“泄露了。

我认为这里的基本问题是“为什么不会你在堆上分配?”主要原因通常是为了避免内存泄漏,但使用new/delete的注意事项可以保护您免受这种情况的影响 - 并且考虑到图书馆中的动态分配无处不在,即使有了良好的内存卫生,也无法停止思考你设法避免动态分配。

相关问题