コンパイル時に符号付き型を操作するときに右シフトが算術であるかどうかをチェックする最も移植性の高い方法は何でしょうか(たとえば、であるかどうか-2 >> 1
) 。-1
私の考えは、コンパイル時にこれを何らかの方法でチェックし、これを検出できるようにすることです。これにより、関数のさまざまなバージョンをコンパイルできます(演算子>>
が実際に算術シフトであるかどうかによって異なります)。
トピックを読んで、 C / C ++の符号付き右シフトが特定のコンパイラの算術であることを確認しますか?フラグを初期化するというアイデアになりました
static const bool is_arithmetic_rs = (((signed int)-1)>>1) == ((signed int)-1));
そして、次のように実行時にテストします。
if (is_arithmetic_rs) {
// some fast algorithm using arithmetic right shifts (using >> operator)
} else {
// the same algorithm without arithmetic right shifts (much slower)
}
ただし、可能であれば毎回この分岐を避けたいと思います。簡単にするために、ポータブル算術右シフトを実装したいとします。関数が呼び出されるたびにこれをチェックする必要がある場合、これはパフォーマンスに大きな影響を与えるため、可能であればコンパイル時にチェックしたいと思います。
このチェックを実行する移植可能な方法が存在しない場合、特定のコンパイラ/プラットフォームのifdefをチェックするなど、ベストエフォートベースでチェックすることによってこれを実行する方法はありますか?