4

複数のネストされたテスト__builtin_expected内で gcc のマクロを使用して何をラップする必要がありますか? if私はこのコードを持っています:

if((x<RADIUS && (forward?v<0:v>0)) || (x+RADIUS>dimensions[d] && (forward?v>0:v<0)))

私は(ばかげて)私ができるすべてをラップしました:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
if(unlikely(unlikely(unlikely(x<RADIUS) && likely(likely(forward)?likely(v<0):likely(v>0))) || unlikely(unlikely(x+RADIUS>dimensions[d]) && likely(likely(forward)?likely(v>0):likely(v<0)))))

ほとんど読めないので、やり過ぎだといいのですが。

4

1 に答える 1

4

ここに間違った答えはないと思います。コンパイラはヒントを使用して、すべての比較でどのケースを「else」ケースにするかを決定します。それは C コードだけでなく、ロジックのANDORの内部でもあり、情報が多ければ多いほど良いのです。

コードを読みやすくするために、if ステートメントごとに 1 回という大きなものにしておくことをお勧めしますが、それは確かな証拠に基づいているわけではありません。

の使用を検討し-fprofile-generate、典型的なデータでコードを実行してから、 で再構築しました-fprofile-useか? そうすれば、コンパイラはこれらすべてのケースに対して独自の図を作成できます。これは、移植性が高く (コンパイラ固有の注釈がない)、読みやすく、将来性があります。

于 2012-05-25T13:57:13.060 に答える