1

私は趣味のC++プログラマーであり、現在(Ogre3Dを使用して)ゲームに取り組んでいます。メインクラスのメモリ割り当てについて質問があります。

私はメモリ割り当て、スタックに自動的に割り当て、ヒープに動的に割り当てること、およびそれらの違い(パフォーマンス、制限されたスタックサイズ)について多くのことを読みました。それでも、メインクラス(Application)と他のいくつかの「factory」クラス(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_;
};

スタックまたはヒープ(アプリケーションクラスとファクトリクラスの両方)にメモリを割り当てる方がよいですか?そして、どのような議論によって?

前もって感謝します!

4

3 に答える 3

4

動的割り当てよりも常に自動割り当てを優先します。また、動的な割り当てが必要な場合は、スマート ポインターなど、自動的に割り当てられたリソース ラッパーによって有効期間が管理されていることを確認してください。

于 2011-02-22T01:34:52.990 に答える
0

この状況では、すべてはサイズに帰着すると思います。

スタック スペースを無駄にしたくないので、 で動的割り当てを使用するか、new外部Applicationのグローバル変数として配置しますmain()

于 2011-02-22T01:31:15.310 に答える
0

C++ では、問題はかなり複雑になりますが、一般に、ヒープへの割り当てを避けることはできません。たとえば、new操作がApplicationヒープにオブジェクトを割り当てているとします。メモリの割り当てはコンパイル時に決定さnewれ、実行時に動的にメモリを割り当てます。(もちろん、実際には実行時に割り当てられますが、コンパイルされた割り当てに従って、起動コードがスタックを作成するときに割り当てられます。)automain

では、なぜヒープへの割り当てを避けたいのでしょうか? ヒープ サイズが限られていることが原因かもしれませんが、最新のマシンでは、ハンドヘルド デバイスであっても問題になることはめったにありません。ただし、スタック スペースは限られている可能性があります。したがって、それはヒープを主張します。

もちろん、autoメモリが「リーク」することはありませんが、メイン (静的ですがファイル スコープ) に割り当てられたメモリは解放されないため、「自動的に」リークしたとほぼ主張できます。

ここでの本質的な質問は、「なぜヒープに割り当てないのか?」ということだと思います。主な理由は通常、メモリ リークを回避することですが、注意して使用new/deleteすることでそれを防ぐことができます。また、ライブラリなどでの動的割り当ての遍在性を考えると、動的な割り当てを回避するように工夫したとしても、適切なメモリの衛生状態について考えるのをやめることはできません。割り当て。

于 2011-02-22T01:31:34.480 に答える