C++Builder相談室 Part6
■ このスレッドは過去ログ倉庫に格納されています
0296デフォルトの名無しさん
NGNGこれは真実。
さて。名前(空間)の衝突を考えなければ、親関数のローカル変数と子関数のローカル変数は
同一のストレージにとることができる。スコープと寿命の問題はメモリ実体とは切り離して考
えることができるからね。
本質的にスタックフレームを作らなければいけないのは、直接/間接に再起呼び出しを行う場合
だけだ。ある関数が再帰呼び出しされるかどうか、その結果本質的に同じ名前の変数を複数生成
し、かつ弁別する必要があるかどうかをコードからコンパイラが知ることは非常に困難だ。
だからほとんどの処理系では再帰呼び出しされても大丈夫なようにスタックにフレームをとる。
しかし、現実のアプリケーションにおいて再帰呼び出しが起きることは非常にまれだ。
ということで、意味的にローカル変数であるものをすべてグローバル変数として領域を割り当てる。
もし再帰呼び出しが発生したら、そのときに、古い(ローカル)変数群をスタックに保存。
再帰関数が終了した時点で、スタックから古い変数の値を復元。
という処理系が存在した。ローカル変数をスタックに取らないため、ほとんどすべての変数参照が
絶対アドレス参照となり、再帰使わなくても高速。
■ このスレッドは過去ログ倉庫に格納されています