サブルーチン化について(2)
関数が呼ばれる際には関数の実行に必要なデータがスタックメモリ上に確保されます。
主に以下のようなものです。
- 関数の戻り先アドレス
- 関数の引き数
- 関数の返り値
- 関数内で定義された自動変数
これらは関数が呼ばれるたびにスタックメモリ上に確保され、関数が終わる際に開放されます。
関数内に新たに関数を作るということは、これらがスタックメモリ上に確保される回数が増えることを意味します。
これはサブルーチン化のデメリットの一つです。
ただ、上記のうち「関数内で定義された自動変数」については、サブルーチン化によって改善する可能性があります。
例えば大きな1つの関数を複数のサブルーチンに分割して、元の関数が参照していた自動変数がそれぞれのサブルーチンに均等に分散された場合、個々のサブルーチンが呼ばれる間はそれぞれが必要とする分しかスタックメモリに確保されません。
場合によってはスタックメモリの消費量の減少が期待できます。
これはサブルーチン化のメリットと言えるでしょう。
要するにメモリ消費の観点からすると一長一短なのですが、実はこれらで増減する消費メモリ量はわずかであり、余程のことがない限りスタックメモリが足らなくなることは起こらないのであまり気にする必要はないかもしれません。
もちろん開発環境次第ではあるのですが、私の経験上では関数の書き方・呼び出し方を工夫しないとスタックメモリが枯渇してしまうような状況に遭遇したことはありません。
(何百回と再起呼び出しされるような関数を実装してしまうと話は別ですが…)
スタックメモリ消費量の改善のために可読性を犠牲にしなければらないような機会は極めて少ないと思います。
ですが、少なくとも知識として上記のことは把握しておいた方がよいでしょう。