未使用の変数が最適化で消されるのを防ぐ方法#
作ったプログラムのパフォーマンスを見る場合、結果を確認する必要のない計算を何度も繰り返して時間を計測したくなることがある。しかし、コンパイラの最適化は未使用の変数を最適化で消しても良いことになっているため、テストプログラムを高速化するためにコンパイラが計算結果を消去し、不要な計算を削除してしまう可能性がある。
コンパイラの最適化で変数が消えてしまうのを防ぐための方法を調べてみた中で、比較的便利そうなものを見つけたためメモしておく。
How to stop optimizer discard unused variables? で紹介されていた手法として、次のようなマクロを利用するものがあった。
#define FORCE_LINKING(x) { void* volatile dummy = &x; }
volatile
には、
volatile
が付けられた変数へのアクセスをコンパイラの最適化で省略できないという特性がある。その結果、上記のマクロにおいてポインタの代入は省略できず、
x
のメモリ領域を保存する必要が生じるという仕組みになっている。