GCCのマクロ
色々なところに、文献あると思いますが、とりあえず以下。
https://www.ibm.com/developerworks/jp/linux/library/l-gcc-hacks/
GCC の中に、ビルトインでマクロが用意されています。
基本的に、カーネルで使用する記述になっていますが、GCCのマクロですので
ユーザ空間でも使用可能なものもあります。
その中で、性能改善に有効なもの(ドライバで良く使用)を紹介します。
・分岐予測のヒント
#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)
※ ユーザモードのコンパイルでは、上記マクロは未定義なので
自分で定義する必要があります。
// 使い方 1 // 以下の例の場合、コンパイラは、likely判定を先に行うアセンブラ命令 // 出力します。 優先する予測情報をコンパイラに与えます。 // 処理として、良く走るところを 優先として登録します if ( likely( a == 1 ) ) { printt(" ok "); } else { print(" ng "); }
// 使い方 2 // よくある エラー判定には、unlikely を 設定すると 正常に処理された // ret == 0 が先に 判定されて、性能改善になります ret = ioctl(); if ( unlikely( ret != 0 )) { printf(" NG"); return(ret); }