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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

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

#1

投稿記事 by dic » 14年前

ゲームを作成してて思ったのですが、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: 実行ファイルが起動するときの最初のメモリの容量内でないといけない

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

ある程度実装依存しますが、WindowsやLinuxの話に限定します。

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

デメリットは
new,heep: メモリが確保できなかった場合の処理を書かないといけない
stack: 指定されたstackサイズを合計でオーバーしては行けません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
a5ua
記事: 199
登録日時: 14年前

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

#3

投稿記事 by a5ua » 14年前

実行ファイルに埋め込まれるのは、静的(static)変数です。(auto変数や、malloc等による確保は実行時に動的に行われます)
C言語では、ローカル変数にstaticをつけた変数が静的変数となります。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

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

#4

投稿記事 by dic » 14年前

>>softyaさん a5uaさん
auto変数とstatic変数を間違っていました
これ以外はだいたいあってますね
ありがとうございました

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 14年前

dic さんが書きました:>>softyaさん a5uaさん
auto変数とstatic変数を間違っていました
これ以外はだいたいあってますね
ありがとうございました
auto変数とstatic変数の生存期間の違いを理解されているなら問題ないと思いますが、混同されているなら危険ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る