第九回-02 関数内の変数のメモリ配置

引続き、今度は main 関数以外にも関数があるときのメモリの使われ方について学ぼう。
これはスタック領域がそう呼ばれる理由となっている。

まずはプログラムを書くことから

本ページでは第八回-01 見ためを気にしよう〜タブによる字下げで用いた ベキ乗を計算するプログラムを再び用いよう。
これは第七回課題の解答でもあった。

まず、 main 関数の中身を以下で書き換える



やっていることは、いつも通り x と n のアドレスを表示させた後、
square 関数 (x の2乗)、cubic 関数 (x の3乗)、beki 関数 (x の n) 乗を順に呼び出して計算結果を表示しているだけである。

計算結果はもちろん以下のようになる。いつも通り、アドレスは環境により異なる可能性がある。



まずはここまでをクリアして欲しい。


関数内の変数のメモリ配置

さて、先程呼び出した square 関数、 cubic 関数、 beki 関数は全て自分で自作した関数であった。
詳細は第七回-01第七回-02第七回課題を復習すること。

それらの関数の中でそれぞれ新たに変数を用いているわけであるが、 それらのアドレスを以下のように調べてみよう。
コードの左に緑色の印がついている箇所 (7行ある) を追加して記述し、実行してみよう。



結果は以下のようになる。アドレスは環境により異なる可能性がある。





(演習)
実際に表示されたアドレスを元に、
square 関数、cubic 関数、beki 関数が実行されている時の メモリの状態をそれぞれ図示せよ。


解答はこちら

なお、double 型の変数 x と val は 8 バイトであるので、これまでの図で言えば メモリは2行分使われることになる。
int 型や double 型などがそれぞれ何バイトで表されているかを知りたい場合は 以下のように sizeof 演算子を使えばよい。

std::cout << "int 型は" << sizeof(int) << "バイト\n";
std::cout << "double 型は" << sizeof(double) << "バイト\n";


なお、これまで「メモリのスタック領域」という用語を頻繁に用いて来たが、
そもそも「スタック」とは情報工学で、メモリの領域以外にも一般的に用いられる用語である。

そもそもスタックとは、最初に入れたデータが最後に取り出されるようなデータ構造のことを言う。
FILO (First In, Last out: 先入れ後出し)、 LIFO (Last In, Fisrt out: 後入れ先出し) などとも呼ばれる。
しばしば用いられる例えは、「食堂のお盆」である。





←第九回-01 スタック領域上での配列の配置第九回課題→

非情報系学生のための C/C++ 入門に戻る