[c++] 整数の範囲を指定してオプティマイザをヒントできますか?



Answers

これには標準的なサポートがあります。 あなたがすべきことは、 stdint.hcstdint )をuint_fast8_tuint_fast8_t型を使用することuint_fast8_t

これはコンパイラに、0〜255の数値だけを使用していることを伝えますが、より高速なコードを与える場合は大きな型を自由に使用できます。 同様に、コンパイラは変数が255を超えることはないと想定し、それに応じて最適化を行います。

Question

私は値を格納するint型を使用しています。 プログラムのセマンティクスによって、値は常に非常に小さい範囲(0〜36)で変化し、 intcharはない)はCPU効率のためにのみ使用されます。

このような小さな範囲の整数に対しては、多くの特別な算術最適化を実行できるようです。 これらの整数に対する多くの関数呼び出しは、小さな「魔法の」操作のセットに最適化され、いくつかの関数はテーブルルックアップに最適化されることさえあります。

したがって、コンパイラにこのintが常にその小さな範囲にあることを伝えることは可能ですか?また、コンパイラがこれらの最適化を行うことは可能ですか?




私はもっ​​と標準的なC ++のソリューションが必要な場合は、 [[noreturn]]属性を使用して独自のunreachableを記述することがunreachableます。

だから私はデニスの優れた例を実証するために再利用します:

namespace detail {
    [[noreturn]] void unreachable(){}
}

#define assume(cond) do { if (!(cond)) detail::unreachable(); } while (0)

int func(int x){
    assume(x >=0 && x <= 10);

    if (x > 11){
        return 2;
    }
    else{
        return 17;
    }
}

あなたが見ることができるように 、ほぼ同じコードになります:

detail::unreachable():
        rep ret
func(int):
        movl    $17, %eax
        ret

欠点はもちろんですが、実際には関数が戻ってくるという警告を受けることは[[noreturn]]ません。




Links