ダミー関数呼び出しの無視できないオーバーヘッド
おはようございます。夢でわがままな男子(小学4年生)が出てきて、その子に何が良いことか悪いことかを必死になって教え続けたせいでグッタリした寝起きのカトキチです。いったい何なんだ・・・
さて、C/C++プログラムの手軽なデバッグ方法として、printf()を埋め込んでその時々の変数や状態を表示させる方法があります。
っていうか、組み込み向けで、エミュレータもなく、リモートデバッガも遅くて使えないような環境ではprintf()をコンソールに出力させる方法くらいしかないのですが・・・。
他の言語でも一般的な方法ですね。C/C++ではさらに、埋め込んだprintf()をそのまま残してリリースできるように、printf()にラッパー関数をかぶせておいて、リリース時にはその関数ごと無効化してしまう、という方法もよく行います。assert()のようなイメージですね。例えば、
(1)
#if _DEBUG
#define dbg(fmt, ...) printf("debug:" fmt, __VA_ARGS__) // __VA_ARGS__はC99の新機能
#else
#define dbg(...)
#endif
(2)
#if _DEBUG
#define dbg real_dbg
#else
#define dbg dummy_dbg
#endif
(1),(2)どちらもデバッグプリントの実現方法なんですが、(1)ではマクロでデバッグプリントを実現する方法で、無効化時にはプリプロセッサで文ごと削除する方法、(2)ではマクロの定義状況によってデバッグ用の正式な関数(real_dbg)をコールするか、ただ0を返すダミー関数(dummy_dbg)をコールするかを分ける方法です。
これによってリリース時の動作とデバッグ時の動作を切り替えられるようになります。
ところが、このうち(2)の方法には落とし穴があります。
関数呼び出しをダミー関数で削除したとしても、ダミー関数をコールすることによるオーバーヘッドが残ってしまうことです。
| 固定リンク
| コメント (2)
| トラックバック (0)


最近のコメント