それはあなたのプログラムのスタック使用量の「ハイウォーターマーク」を減らし、そしてかもしれないがプログラムの全体的なメモリ要件を減らす可能性があるようであれば。
はい、最適化によって異なります。オプティマイザが関数呼び出しをインライン化すると、インライン化されたすべての関数のすべての変数が1つの大きなスタックフレームにラップされることがわかります。使用価値のあるコンパイラは[*]をインライン化することができるため、コンパイラに依存しないという事実があります。まさにそれが起こったときに違います。
ローカル変数が小さい場合は、起動時に自動的に割り当てられたスタックより多くのスタックをプログラムで使用することは非常にまれです。あなたが最初に与えられたものを過ぎていない限り、どれくらい使っても全体的なメモリ要件には何の違いもありません。
スタックに大きな構造体(複数キロバイト)を置いている場合、またはキロバイトが大量のメモリを搭載しているマシンでは、全体的なメモリ使用量に影響を与える可能性があります。だから、 "たくさんのローカル変数"によって何十ダースを意味するのであれば、int
とポインタはいいえ、あなたは何も重要な違いはありません。 「多くのローカル変数」によって数十kのバッファを意味する場合、または関数が非常に深く再帰して数十億のレベルの何百ものレベルを持つ場合は、それは可能な限り少なくなる可能性がありますOSと設定で
一般的なRAMによってスタックとヒープが相互に向かって成長し、中央の空きメモリがどちらか一方でも同等に使用できるモデルは廃止されています。ごくわずかな、非常に限られたシステムを除いて、メモリモデルはそれ以上は設計されていません。現代のOSでは、いわゆる「仮想メモリ」があり、スタック・スペースは一度に1ページずつプログラムに割り当てられます。それらのほとんどは、通常は非常に大きな設定された制限まで、使用されているスタックのページを自動的に割り当てます。いくつかのものは自動的にスタックを拡張しません(Symbianは最後に使っていましたが、これは数年前のことでしたが、Symbianは "現代的" OSではないと言えます)。組み込みOSを使用している場合は、スタックに関するマニュアルの内容を確認してください。
いずれにしても、合計メモリ使用量に影響を与えるのは、一度に必要なスタックページ数だけです。システムがスタックを自動的に拡張する場合、使用量に気づかないことさえあります。そうでない場合は、プログラムに最高水準点のスタックが十分に与えられていることを確認する必要があります。要するに、これは理論的に違いを生むものの1つですが、実際にはその差はほとんど常に重要ではありません。
[*]基本的には最適化されていないアセンブラであるCコンパイラを使用して、PICなどでC言語でプログラミングしている人は、プログラムが大量のスタックを使用する場合にのみ問題になります。私は彼らのコンパイラを "使う価値がない"と呼んだことを怒らせてしまいます。そのようなデバイス上のスタックは、回答が異なっている「典型的な」システムとは非常に異なっています。
メモリを最小限に抑えるようにコードを構成しないでください。あなたに最も合って理解しやすい方法でそれを行います。マイクロ最適化は時間の無駄です。 –
あなたのコンピュータは1970年に建てられましたか?それは[PDP11](http://en.wikipedia.org/wiki/PDP-11_architecture)のような限られたアーキテクチャですか? –
いいえ、読みやすくする方が効率的です。プログラマはコンピュータメモリよりもはるかに高価です。 –