ページ 11

ヒープとスタックメモリの違いについて

Posted: 2011年3月09日(水) 22:30
by dic
ゲームを作成してて思ったのですが、C/C++言語で malloc, new などでメモリを確保してから使う方法と
auto変数として使う方法があります
たとえば下のような感じです

コード:

#include <iostream>

class	CTest
{
	int	m_Value;
public:
	CTest( int value );
	void	Print();
};
CTest::CTest( int value )
{
	m_Value = value;
}
void	CTest::Print()
{
	printf( "%d\n", m_Value );
}

int main()
{
	CTest*	heep = new CTest(10);
	heep->Print();
	delete heep;

	CTest	stack(20);
	stack.Print();

	return 0;
}
このとき変数heepがOSの使用できるメモリからCTestのサイズのメモリを確保してから
いろいろ処理するのと、stackとしてexeファイルに埋め込む形にするのでは何が違うのでしょうか?
クラスのインスタンスへのアクセスや操作方法がちょっと異なる -> . などはわかります
私の勝手な予想だと、new の方法は、OSの使用できるメモリがある限り成功して
CTest stack(20) の方は、exeファイルに埋め込み、実行するときに確保されるメモリの領域内に
そのstackのサイズがないと失敗すると思ってます

メリットとしてはそれぞれ
new,heep: OSの使用できるメモリいっぱい使える
stack: exe内にオブジェクトを埋め込めるので簡単、delete を書く必要がない

デメリットは
new,heep: メモリが確保できなかった場合の処理を書かないといけない
stack: 実行ファイルが起動するときの最初のメモリの容量内でないといけない

と思ってます
どこか間違っているところがあればご指摘してくれると助かります

Re: ヒープとスタックメモリの違いについて

Posted: 2011年3月09日(水) 23:20
by softya(ソフト屋)
ある程度実装依存しますが、WindowsやLinuxの話に限定します。

[メリット]
new,heep: OSの使用できる仮想メモリいっぱい使える。連続で指定サイズで仮想記憶空間に確保できる場合に限る。
auto変数。stackに{}ブロック単位で確保されるが、stackサイズはexeにサイズが書かれています。stackは実行時に動的にOSから確保されます。delete を書く必要がありません。
stackサイズはリンカーで変更できます。スレッドはそれ専用のスタックが別に確保されます。

デメリットは
new,heep: メモリが確保できなかった場合の処理を書かないといけない
stack: 指定されたstackサイズを合計でオーバーしては行けません。

Re: ヒープとスタックメモリの違いについて

Posted: 2011年3月09日(水) 23:45
by a5ua
実行ファイルに埋め込まれるのは、静的(static)変数です。(auto変数や、malloc等による確保は実行時に動的に行われます)
C言語では、ローカル変数にstaticをつけた変数が静的変数となります。

Re: ヒープとスタックメモリの違いについて

Posted: 2011年3月10日(木) 10:17
by dic
>>softyaさん a5uaさん
auto変数とstatic変数を間違っていました
これ以外はだいたいあってますね
ありがとうございました

Re: ヒープとスタックメモリの違いについて

Posted: 2011年3月10日(木) 10:22
by softya(ソフト屋)
dic さんが書きました:>>softyaさん a5uaさん
auto変数とstatic変数を間違っていました
これ以外はだいたいあってますね
ありがとうございました
auto変数とstatic変数の生存期間の違いを理解されているなら問題ないと思いますが、混同されているなら危険ですね。