C++での関数名オーバーロードしたインライン関数について (日記/備忘録)
競技プログラミング用C++コードテンプレに,標準入力のインライン関数を追加した.以下のような感じ.
inline void scan(int&a){scanf("%d",&a);} inline void scan(vector<int>&v){int sz=v.size();rep(i,sz){scan(v[i]);}} inline void scan(char&a){scanf(" %c",&a);}
scan(x)
という一貫した形で標準入力を受け取れて嬉しい.
関数名は全てscan
にした.つまり関数名のオーバーロードを利用した.
ところでオーバーロードされた関数名が呼ばれるとき,どの程度のオーバーヘッドがあるのだろうか.競技プログラミングでは速さが重要ゆえ,これを考えないわけにはいかない.
しかしながら今回の場合,インライン関数については関数の決定はコンパイル時に行われ,実行ファイル上ではすでに手続きが展開されているはずであるので,実行時のオーバーヘッドは無いものと考えてよいはずである. というかインライン関数でなくても呼ばれる関数はコンパイル時に決定されるのでは.