他人が作ったプログラムの中で、以下の関数Aのように、new~deleteを使ってメモリを確
保してる関数があります。
●関数A
void funca(void)
{
char *buf = new char[256];
・
・
・
delete [] buf;
}
上記の関数Aは、以下の関数Bのように、new~deleteを使わなくてもまったく同じことが
実現できると思いますが、その認識で合ってますでしょうか?ちなみに処理の中で、メモ
リ再確保などは行いません。
●関数B
void funcb(void)
{
char buf[256];
・
・
・
}
関数Aの記述と関数Bの記述とで、実際の処理内容が違うなんてことはありますか?
(関数Aの記述ではOKだけど関数Bの記述ではNGな処理とか)
関数Aのやり方と関数Bのやり方の、違いを教えてください。
メモリがヒープに確保されるかスタッフ領域に確保されるかの違いだけでしょうか?
よろしくお願いします。
うーーん、
僕の場合、
1. メモリーの容量が多い場合(1Mバイト以上)
2. 画像処理等で「new~delete」が必要な場合。
3. 途中でグローバルな関数を使っている場合。
(通信やファイル処理の関数で「call-back関数」を読んでいる場合)
4. 複数のスレッドの共有メモリーで使う場合。
ぐらいでしょうか?
WIN32APIを使う場合も、「new~delete」が必要な場合があるみたいですね。
リストをよく見たほうがいいですね。
他人が作ったソフトだと、古いVC(VC6.0等)作った部分がそのまま残っている
可能性もあると思います。
CPUの動作がまったく異なります。
関数A.
newオペレータが実行されると、bufポインタに「フリーストア」という領域から
256Byteのメモリーを確保します。
deleteオペレータが実行されると、bufに確保したメモリーを「フリーストア」に
戻します。
関数B.
char型の []オペレータが実行されると、「スタック」という領域から
256Byteのメモリーを確保し、そのポインタをbufに代入します。
関数から抜けるときに、これはを含めてその関数が「スタック」に確保した全ての
メモリーが戻されます。
Windowsの場合、
A.フリーストアから確保できるメモリーの限度は32bitの場合
プロセスあたり約2GByteです。
B.スタックはスレッドあたり、呼び出して実行中の関数の一連に対して、2
MByteがデフォルト値です。
コンパイルオプションで変更することができます。
従って、大量に使用するとスタックはたやすく枯渇しますが、
フリーストアはそう簡単に不足することはありません。
orz.
×CPUの動作がまったく異なります。
○関数の動作がまったく異なります。
返信が遅くなりスミマセンでした。
関数内で特別なことはしてないし、確保領域もそれほど大量ではありません。
なので違いはなさそうですね。お二方、ありがとうございました。