質問: 現在、ゲームプログラミングの勉強をしているものです。 c++以外はあまり勉強できていない為c++での回答をお願いします。 メモリの動的確保の利便性、というか使い道のようなものについての質問です。 現在、私のメモリ動的確保の使いかたの認識として、 --- 1.グローバル変数などでクラスのポインタを作成し、メイン関数などの中でクラスをnewでメモリ確保、プログラムの最後でまとめてdeleteで解放する(Init関数などを作らず、コンストラクタ、デストラクタによって初期化や解放忘れを防ぐため) 2.必要な配列の個数がプログラム中で変動する可能性があるときに、newで動的確保する --- この2種類が基本的なものだと認識しております。 しかし、どちらの使い方も私の中ではあまりはっきりしておりません。というか、「あまり使い道がない」な、と思ってしまいます。正直どちらもnewを使わずとも可能なので、少なくとも使わなければいけないもの、ではないとは思っています。 少し極端な例になりますが、「初期化、解放忘れが絶対にない」「配列は使わないor全て静的確保で問題ない」を前提にした場合、もしかしてメモリの動的確保自体必要ないものなのでしょうか。 お尋ねしたいのは、 --- 1.c++でnewに上記以外の使いかたがあるのか 2.「初期化、解放忘れが絶対にない」「配列は使わないor全て静的確保で問題ない」事が確定しているとき、newは必要ないものなのか --- ということです。 拙い文章ではありますが、どうかよろしくお願いいたします。
回答: > > 現在、私のメモリ動的確保の使いかたの認識として、 > > 1.グローバル変数などでクラスのポインタを作成し、メイン関数などの中でクラスをnewでメモリ確保、プログラムの最後でまとめてdeleteで解放する(Init関数などを作らず、コンストラクタ、デストラクタによって初期化や解放忘れを防ぐため) > > 2.必要な配列の個数がプログラム中で変動する可能性があるときに、newで動的確保する > > > 動的メモリ確保を必要とするのは、本質的には「プログラムのコンパイル時点ではその動作に必要なメモリ量を決定できない」からです。質問文中にある2は正しい認識ですが、1には必然性がありません(あなたの認識が間違っているという意味ではなく、動的メモリ確保を伴わないグローバルオブジェクトという設計方法もあり得るという解釈)。 > > 初期化はコンストラクタで行うことが多いです。(中略) > > 最後に、配列も含めて全て静的確保で良いケースならnewは使わなくても問題ないです。 > > > 上記の認識で正しいです。そして、C++プログラムとしては「動的メモリ確保を必要としないならば、全てを静的メモリ確保とする方が望ましい」です。あらゆる動的メモリ確保処理はバグ要因となるリスクがありますし、実行時パフォーマンス(処理時間・メモリ効率)の点でも静的メモリ確保の方が優れています。 理想的には上記の通りですが、現実には多くのプログラムで取扱データ量やユーザ入力をコンパイル時に確定することは出来ません。このため、プログラム実行時の動的メモリ確保は避けられない(ことが大半)です。 > > 1.c++でnewに上記以外の使いかたがあるのか > > > 簡単な答え:`new`は動的メモリ確保のための仕組みです。それ以上の使い方はありません。 マニアックな答え:極一部のC++ライブラリでは、placement-new構文とよばれる特殊な呼び出し方を利用し、演算子オーバーロードにより動的メモリ確保以外の役割を担うことがあります。(私が知る限りはIntel TBB) > > 2.「初期化、解放忘れが絶対にない」「配列は使わないor全て静的確保で問題ない」事が確定しているとき、newは必要ないものなのか > > > 動的メモリ確保を行う合理的理由が無ければ、newは必要ありませんし使うべきでもありません。