一時的な値として 0 または 1 の整数を返す式があります。値はおそらく既にレジスタにあり、インライン関数からブール値として返したいと思います。
これを行う通常の方法はありますか?私は信じて(bool)
、static_cast<bool>
追加のテストとセットの指示を注入します。これは私には多すぎますが、メモリ マネージャーのパフォーマンスが重要な部分についての話です。
一時的な値として 0 または 1 の整数を返す式があります。値はおそらく既にレジスタにあり、インライン関数からブール値として返したいと思います。
これを行う通常の方法はありますか?私は信じて(bool)
、static_cast<bool>
追加のテストとセットの指示を注入します。これは私には多すぎますが、メモリ マネージャーのパフォーマンスが重要な部分についての話です。
それを返すだけです。c++ のisおよびisとは異なる任意の値。0
true
0
false
インライン関数 (これは を返します) からreturn
だけです。int
bool
戻り値で何をしていますか?条件付きですぐに使用している場合、コンパイラは、型がそうであるかどうかに関係なく、おそらくまったく同じコードを生成しますbool
。との簡単な比較になり0
ます。変数に代入する場合bool
、コンパイラは通常、追加の命令を生成して、バイナリ値が0
or 1
(他の値ではない) であることを確認します。しかし、それが 0 か 1 であると確信できる式は何でしょうか? のようなものであればx & 1
、優れたコンパイラはこれを認識し、余分な命令を最適化します。
編集:
インライン化と最適化を想定していることを付け加えるかもしれません。パフォーマンスが問題になる場合は、最初にこれら 2 つの手順を実行する必要があります。
整数式が であると仮定するとfoo
、 を使用!!foo
して値を取得しbool
ます。
どうですか
return rtVal;
整数を返すだけで、0 でない場合は true が返されます
C++ 2012 標準 (ISO/IEC N3337) から:
4.12 ブール変換
算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。ゼロ値、NULL ポインター値、または NULL メンバー ポインター値は false に変換されます。その他の値は true に変換されます。std::nullptr_t 型の prvalue は bool 型の prvalue に変換できます。結果の値は false です。
じゃあ返すだけ?!