「A、B、および C がすべて D に等しい場合」の略記はありますか? 私が現在いるシナリオでは、実際の値ではなく、すべてが等しいかどうかを確認することにのみ関心があるため、「A、B、C、および D が同じ場合」の何かも機能します。
6 に答える
これが速度制限になる可能性が高いシナリオに遭遇する可能性はほとんどありません。ただし、多くの場合、ループ内のブランチを最小化するのが最も高速です。
Id do
!(a^b | b^c | c^d)
少なくともループが実行されるたびに結果が同じでない場合は、ビット演算子がワイルドプラサーの回答|
の短絡よりも高速になると思いますが、想定しないでください。||
それが実際に重要な場合は、両方を試して測定してください。
かなり短い構文ですが
質問は C としてタグ付けされていますが、C++11 が許可されている場合はall_equal
、次のように定義できます。
template <typename T1>
inline bool all_equal(T1&& val) {
return true;
}
template <typename T1, typename T2, typename... Ts>
inline bool all_equal(T1&& val1, T2&& val2, Ts&&... rest) {
return val1 == val2 && all_equal(std::forward<T2>(val2), std::forward<Ts>(rest)...);
}
使用例:
all_equal(3); // true
all_equal(3, 3); // true
all_equal(3, 4); // false
all_equal(x, y, z); // would be expanded to 'x == y && y == z'
引数の数に制限はありません。
C に固執したい場合は、可変長の引数リストを使用できますが、お勧めしません。
短絡的な XOR トリック:
int abcd(unsigned aa, unsigned bb, unsigned cc, unsigned dd)
{
#define FOUR_UNEQUAL(a,b,c,d) ((a^b^c^d) || (a^b) || (c^d) || (b^c)) ? 1 : 0
return FOUR_UNEQUAL(aa,bb,cc,dd);
}
生成されたアセンブリ (GCC 4.6.1-9ubuntu3):
type abcd, @function
abcd:
.LFB23:
.cfi_startproc
movl %esi, %eax
xorl %edi, %eax
xorl %edx, %eax
cmpl %ecx, %eax
jne .L7
cmpl %esi, %edi
jne .L7
cmpl %ecx, %edx
setne %al
cmpl %edx, %esi
setne %dl
orl %edx, %eax
movzbl %al, %eax
ret
.p2align 4,,10
.p2align 3
.L7:
movl $1, %eax
ret
.cfi_endproc
そして、前述のように、速度の向上はわずかです (あるとしても)。
おそらく、「最も速い」方法は、ペアを比較してから、ペアの結果を確認することです
(A == B) && (C == D) && (A == C)
。実際にOPで示されているように。より多くの要素、作業ペア、および結果の結合については、完全なバイナリ ツリーを作成します。&&
平均してできるだけ早く失敗するように、並べ替えまで行う可能性があります。いずれにせよ、これは非常に特殊な操作なので (そのようなことをしたことがあるかどうかはすぐには思い出せません)、これに余分な記法を提供すると、得られるものよりも多くの損害を被る可能性があります。
いつものように、最初に最も読みやすいコードを書き、測定値が価値があることを示す場合はパフォーマンスをマッサージします。人間の時間 (コードの作成、デバッグ、保守) は、非常にまれな場合を除いて、コンピューターの実行時間よりもはるかに価値があります。
それを行うマクロを定義できます。
#DEFINE ARE_ALL_EQUALS(A, B, C, D) (((A) == (B)) && ((B) == (C)) && ((C) == (D)))
ただし、B と C の多重評価には注意してください。
次のようなマクロを定義できます
#define ALL_EQUAL(A, B, C, D) ((A) == (B)) && ((B) == (C)) && ((C) == (D))
しかし、通常のものよりも利点が見られません。