セットアップ
MotionBuilder というアプリケーションの API を使用しています。MotionBuilder プロパティの値にアクセスするには、実際に表すデータ タイプに関係なく、double 変数に読み込みます。
以下は、スカラー プロパティの値を評価するために作成したユーティリティ関数です。
template <typename DataT>
inline DataT GetScalar(FBProperty& prop, FBEvaluateInfo* evaluateInfo)
{
double data = 0.0;
prop.GetData(&data, sizeof(data), evaluateInfo);
return static_cast<DataT>(data);
}
このようにして、初期化されていないバッファとキャストが散らばるコードを散らかす複数行の混乱の代わりにGetScalar<float>(camera.Roll, evaluateInfo)
orを書くことができます。GetScalar<bool>(camera.Visibility, evaluateInfo)
私はVisual Studioでコンパイルし、/W4
すべての警告が表示されたら対処しています。を使用するGetScalar<bool>
と、コンパイラはC4800 警告を生成します。
'double' : forcing value to bool 'true' or 'false' (performance warning)
コンパイラが を作成GetScalar<bool>
すると、double から bool への static_cast が発生しますが、これは明らかに気に入らないようです。私の本来の目的は、単一のテンプレート関数で複数の型 (bool、float、double など) を処理することだったので、通常の!= 0.0
.
この警告に対処するには、2 つのオプションがあります。
オプション1
キャストはまさに私がやりたかったことをしているので、プラグマを使用して警告を直接抑制することができます。
template <typename DataT>
inline DataT GetScalar(FBProperty& prop, FBEvaluateInfo* evaluateInfo)
{
double data = 0.0;
prop.GetData(&data, sizeof(data), evaluateInfo);
#pragma warning (push)
#pragma warning (disable: 4800) // Don't complain about casting to bool
return static_cast<DataT>(data);
#pragma warning (pop)
}
オプション 2
ケースGetScalar
を処理するための特殊化を追加できます。bool
template <>
inline bool GetScalar<bool>(FBProperty& prop, FBEvaluateInfo* evaluateInfo)
{
double data = 0.0;
prop.GetData(&data, sizeof(data), evaluateInfo);
return data != 0.0;
}
質問
static_cast<bool>(x)
一部の double x については、 とまったく同じであると思いますx != 0.0
。実際、リリース モードでコンパイルされた簡単なテストでは、どちらの場合も同じアセンブリ出力が得られます。では、なぜ C4800 は自身を「パフォーマンス警告」と呼ぶのでしょうか? 上記の 2 つのオプションは機能的に同じですか? スタイルの問題になるとしたら、最高の衒学者の帽子をかぶった後、どのオプションが好みですか?