棘手的空检查和调用
tricky null check and invocation
我发现这个样板代码经常出现在我的程序中:
if (ptr) {
ptr->method();
}
,我用一行字替换了它(就像我看到人们在Java
中做的那样):
ptr && (ptr->method(), true);
从生成机器代码的角度来看,这是一个好的做法吗?还是我在二进制文件中引入了额外的常量?这个来自Java
的"端口"可能会在我的程序中引起什么问题?
从生成机器代码的角度来看,这是完全无关的。如果这两种形式中的一种更好,而编译器的优化器不能将一种形式转换为另一种形式,那么它就不值得被称为"优化器",就这样。
这就只剩下了哪个更容易读的问题。第一个是显而易见的。第二个很容易让人花一分钟以上的时间来解析。不好。
还要注意,第二种情况可能会在操作符重载的情况下引入不想要的结果。如果operator ,
为method()
返回的类型重载,它将在第二种情况下被调用,而不是在第一种情况下被调用。如果operator &&
为ptr
类型重载,则第二种情况将失败,因为重载的&&
不会惰性求值。但是,这两个操作符都属于强烈不建议重载的操作符。
相关文章:
- 如何通过python方法和kwargs来提升python的c++函数和调用
- 调用 "project" 函数和调用 DLL 函数之间的区别
- 有没有办法扩展和调用 std::functions 的元组?
- C++构造函数和调用函数
- "is defined"宏检查及其调用必须处于不同的条件下吗?
- 在 malloc 之后检查 &在调用 free() 之前
- 如何动态加载和调用具有特定于库的类型作为函数参数的符号
- 在实现和调用时可以复制函数参数名称吗?
- NRVO不应该保证局部命名变量和调用站点变量采用相同的地址吗?
- C++:调用运算符和调用其实现之间有区别吗
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- 我可以通过设置工具链文件来替换调用 cmake -G<generator> 选项和调用 vcvarsall.bat吗?
- 如果检查和内联条件之间是否存在编译器差异
- C++ 如何绑定和调用模板化类型方法
- 如何在类中检查是否调用宏
- v8.从 C++ 保存和调用 JavaScript 函数
- 如何检查是否调用了成员方法
- 来自Pascal DLL/SO中的C 加载和调用功能
- 如何检查和处理前提条件
- 棘手的空检查和调用