generated at
インライン展開
inline expansion
関数呼び出しの箇所に、関数の定義の内容を展開する大域的最適化の一つ
特に小さくて頻繁に呼ばれる関数では効果的
インライン展開することで更に定数畳み込みなど施せる可能性が生じる
ラムダ計算の文脈ではβ簡約と呼ぶ


前提
関数呼び出し時には沢山の処理が走る
呼び出し実行時
実行時スタックに新しいデータ領域を確保
実引数や制御情報などを書き込む
手続き終了時
戻り値を設定
呼び出した元の手続きに復帰
など
このオーバーヘッドの削減がインライン展開の目的


問題点
バイナリコードが一般に肥大化する
参照の局所性を損なう
リソースを多分に使用する


c
// 関数swapを宣言 void swap(int *x, int *y){ int temp; temp=*x; *x=*y; *y=temp; } // 呼び出す swap(&a, &b); ↓ インライン展開 {int *x;int *y;x=&a;y=&b;{ int temp;temp=*x;*x=*y;*y=temp; }} ↓ 引数を適用するように最適化 {int temp;temp*&a;*&a=*&b;*&temp;} ↓ *a, *bをa, bに置き換えるように最適化 {int temp;temp=a;a=b;b=temp;}



一つの関数内に複数の return がある場合とかの手順を知りたい
だいたい想像はつくんだけど、正解をしりたい
変数名の置き換えのコツなどを知りたい



Python 3.11