• ベストアンサー

C++言語のポインタについて

現在、C++言語を学習しているのですが、 ポインタを使わない、 int main() { Human human; human.Introduction(); } と、ポインタを使った、 int main() { Human *p; p = new Human; p->Introduction(); delete p; } があります。どちらも同じ動作をしますが、ポインタを使ったものがよく使われているのは、 メモリの節約?動作速度?のためなのでしょうか? なぜ使われるのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • teuaitou
  • ベストアンサー率32% (10/31)
回答No.1

ポインタを使わない場合、質問文にあるような自動変数だとスタック上にインスタンスが作成されます。スタックサイズが小さい場合でインスタンスのメモリが大きい場合は、スタックがオーバーフローします。newで作成した場合一般的にはヒープ上に作られますから、比較的大きなメモリが使える場合が多いのではないでしょうか。 インスタンス生成とはチョット違いますが、引数で渡すときに、大きな違いが出てきます。値渡しだと、引数で渡される度にコピーコンストラクタが実行されて、スタックを喰い潰していきます。ポインターであれば、コンストラクタは実行されないですし、どんなのサイズの大きいインスタンスでも、ポインタのサイズ分しかスタックを消費しません。

Mokutsuno
質問者

お礼

ありがとうございます

その他の回答 (2)

回答No.3

>どちらも同じ動作をしますが、ポインタを使ったものがよく使われているのは、 >メモリの節約?動作速度?のためなのでしょうか? >なぜ使われるのか教えてください。 前者は「スタック領域」に変数が作られますが、スタック領域は「サイズに限界がある」のです。 Visual Studio 2015でのスタックサイズの指定 https://msdn.microsoft.com/ja-jp/library/tdkhxaks.aspx?f=255&MSPPError=-2147217396 スタックサイズは「例えメモリが余っていたとしても、コンパイル時に指定されたサイズしか確保されない」ので、スタック領域を浪費して「スタックオーバーフロー」が発生すると、メモリを破壊してプログラムが落ちたり、プログラムが予期しない動作をします。 その為「生存期間が長い変数は、new文で、ヒープから動的に確保する」のが常識です。

Mokutsuno
質問者

お礼

わかりました、ありがとうございます

回答No.2

質問の例だと、前者のように書いちゃう事の方が多いと思います。 どちらの方法で書くか検討されるのは、配列なんかとしてそこそこのサイズを確保する場合でしょうか。 (ちなみに、メモリ領域のうちで、前者の変数が確保されるのはスタック領域、後者のメモリが確保されるのはヒープ領域と言われます。) > ポインタを使ったものがよく使われているのは、 > メモリの節約? サイズが可変な場合は、常に最大数を見積もっていると無駄になる場合、ポインタを使って必要な領域を確保します。 あるいは、サイズが相当に大きい場合は、変数を使った場合スタック領域からオーバーフローする場合があるので、ポインタを使う方法が利用されます。 あるいは、質問の例だとHumanのクラスが巨大(?)だったりなら、ポインタ使うかも。 > 動作速度?のためなのでしょうか? 速度に関しては、処理系なんかによるのでどちらが必ず早いとかって事も言えないようです。

Mokutsuno
質問者

お礼

ありがとうございます。クラスの内容にもよるのですね。

関連するQ&A