アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++ではstructはクラスとして扱われるそうですが、
確保される領域はスタック領域だと聞きました。

StructHoge *structHoge = new StructHoge;

とした場合structHogeに入っているStructHogeインスタンスのアドレスが指し示しているのは
 スタック領域なのでしょうか?

A 回答 (3件)

はっきりいってしまうと, 言語の規格上「変数がどのメモリ領域に配置されるのか」というのは瑣末なことでしかありません. 真に大切なのは「オブジェクトが (時間的あるいはソースコード上の) どの範囲で有効なのか」です. 例えば


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 の有効範囲を実現するためにはスタック領域に置いた方が都合がいい
だけであって, 規格で強制されているわけではありません.
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

大変勉強になりました。

お礼日時:2014/07/11 02:25

C++はJavaと違ってnew演算子を使わなくてもインスタンスの生成できます。



StructHoge sh;

スタック領域で確保されるのは、こういう風にインスタンスを生成する場合です。
ただし#1でいわれているようにC++の規格にスタック領域があるわけではありません。
    • good
    • 0
この回答へのお礼

>C++はJavaと違ってnew演算子を使わなくてもインスタンスの生成できます。

>StructHoge sh;

>スタック領域で確保されるのは、こういう風にインスタンスを生成する場合です。

C++の構造体はデフォルトのアクセス権が違うだけであとはクラスと同じ振る舞いなんですよね。

ところで、

>ただし#1でいわれているようにC++の規格にスタック領域があるわけではありません。
↑はどういう事なのでしょうか?
色々検索してみてもC++でスタック領域、ヒープ領域という風に説明されているサイトが多いのですが、
スタック領域がないとすると、何処に確保されるのでしょうか?

お礼日時:2014/07/11 01:17

new でとってくるのは通称「ヒープ」と呼ばれる領域.



ただし規格上はそもそも「スタック領域」なるものが存在しない.
    • good
    • 0
この回答へのお礼

教えて頂き大変ありがとうございました。
認識が間違えていたようです。


因みに、C++には規格上「スタック領域」が存在しないというのはどういうことでしょうか?
詳しく教えて頂きたいです。

お礼日時:2014/07/11 01:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!