- ベストアンサー
C++のstructが確保される領域について
C++ではstructはクラスとして扱われるそうですが、 確保される領域はスタック領域だと聞きました。 StructHoge *structHoge = new StructHoge; とした場合structHogeに入っているStructHogeインスタンスのアドレスが指し示しているのは スタック領域なのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
new でとってくるのは通称「ヒープ」と呼ばれる領域. ただし規格上はそもそも「スタック領域」なるものが存在しない.
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
はっきりいってしまうと, 言語の規格上「変数がどのメモリ領域に配置されるのか」というのは瑣末なことでしかありません. 真に大切なのは「オブジェクトが (時間的あるいはソースコード上の) どの範囲で有効なのか」です. 例えば void foo() { int i = 0; for (i = 0; i < 100; ++i) { printf("%d\n", i); } } という関数 (C だけど) では, 変数i が「int i = 0; の行から関数の最後まで有効である」ことさえ知っていれば, どのメモリ領域にあろうと何も問題ありませんよね? その意味で, 規格において「スタック領域」やら「ヒープ領域」やらというものを持ち出す必要はないのです. もちろん「現実の機械」で上のプログラムを使うとすると変数i はスタック領域に置くことになるでしょうが, それはあくまで 「int i = 0; の行から関数の最後まで」という変数i の有効範囲を実現するためにはスタック領域に置いた方が都合がいい だけであって, 規格で強制されているわけではありません.
お礼
ご返答ありがとうございます。 大変勉強になりました。
- wormhole
- ベストアンサー率28% (1626/5665)
C++はJavaと違ってnew演算子を使わなくてもインスタンスの生成できます。 StructHoge sh; スタック領域で確保されるのは、こういう風にインスタンスを生成する場合です。 ただし#1でいわれているようにC++の規格にスタック領域があるわけではありません。
お礼
>C++はJavaと違ってnew演算子を使わなくてもインスタンスの生成できます。 >StructHoge sh; >スタック領域で確保されるのは、こういう風にインスタンスを生成する場合です。 C++の構造体はデフォルトのアクセス権が違うだけであとはクラスと同じ振る舞いなんですよね。 ところで、 >ただし#1でいわれているようにC++の規格にスタック領域があるわけではありません。 ↑はどういう事なのでしょうか? 色々検索してみてもC++でスタック領域、ヒープ領域という風に説明されているサイトが多いのですが、 スタック領域がないとすると、何処に確保されるのでしょうか?
お礼
教えて頂き大変ありがとうございました。 認識が間違えていたようです。 因みに、C++には規格上「スタック領域」が存在しないというのはどういうことでしょうか? 詳しく教えて頂きたいです。