- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用名为 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)
或 GetScalar<bool>(camera.Visibility, evaluateInfo)
而不是让我的代码乱七八糟的多行未初始化缓冲区和强制转换。
我在 Visual Studio 中使用 /W4
进行编译并解决所有出现的警告。当我使用 GetScalar<bool>
, 编译器生成 a C4800 warning :
'double' : forcing value to bool 'true' or 'false' (performance warning)
当编译器创建 GetScalar<bool>
时,它以从 double 到 bool 的 static_cast 结束,它显然不喜欢。由于我最初的目标是使用单个模板函数处理多种类型(bool、float、double 等),所以我不能只添加通常的 != 0.0
。 .
为了解决这个警告,我有两个选择。
我可以直接用 pragmas 抑制警告,因为 Actor 正在做我想要它做的事情:
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)
}
我可以添加 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;
}
我认为对于一些双 x,static_cast<bool>(x)
完全等同于 x != 0.0
.事实上,在 Release模式下编译的一个简单测试在两种情况下都为我提供了相同的汇编输出。那么,为什么 C4800 称自己为“性能警告”?上面列出的两个选项在功能上是否相同?如果归结为风格问题,在戴上你最好的学究帽之后,你更喜欢哪个选项?
最佳答案
这是一个警告,告诉您此转换可能存在性能问题。既然你想做转换,那就去做吧。不要浪费时间为没有告诉您任何有用信息的警告编写详尽的解决方法。
关于c++ - `static_cast<bool>(x)` 和 `x != 0.0` 之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580890/
我觉得 for(int i = 0; i < 2; i++) 和 for(int i = 0; i < 2; ++i) 不应该做同样的事情。对于第二个例子,从循环开始 i 应该等于 1 对我来说更符合
我试图牢牢掌握异常情况,以便改进我的conditional loop implementation .为此,我进行了各种实验,扔东西,看看会被抓到什么。 这个让我惊喜不已: % cat X.hs mo
我只是想回答一个问题,但我遇到了一些我不明白的事情!为什么如果我在文件中使用内联 CSS 或 CSS,如本例中的颜色,结果就不一样! 代码相同,但第一段是绿色,第二段是红色! 我真的不明白为什么? 谢
我目前正在学习 CSS 并进行试验,我偶然发现了输出中的这种差异。所以这是代码: .red-text { color: red;
"""module a.py""" test = "I am test" _test = "I am _test" __test = "I am __test" ============= ~ $ p
在向 Firestore 写入文档时,我经常看到 serverTimestamp() 标记和 new Date() 对象之间的差异不为零。 差异范围从几 秒到几十 分钟。 他们不是在做同样的事情吗?
据我了解,2.675 和 numpy.float64(2.675) 都是相同的数字。然而,round(2.675, 2) 给出 2.67,而 round(np.float64(2.675), 2) 给
问题本身的描述很简单。我正在测试 C++11 中 std::thread 库和 boost::thread 库的区别。 这些的输出: #include #include #include int
我只是想将文本文件读入 pyspark RDD,我注意到 sqlContext.read.load 之间的巨大差异和 sqlContext.read.text . s3_single_file_inp
SC.exe 和 InstallUtil 都可以安装/卸载 Windows 服务。但它们的工作方式似乎并不相同。 有什么区别? 例如,InstallUtil 失败(找不到某些文件或依赖项错误),而 S
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我是一名优秀的程序员,十分优秀!