棘手的空检查和调用

tricky null check and invocation

本文关键字:检查和 调用      更新时间:2023-10-16

我发现这个样板代码经常出现在我的程序中:

if (ptr) {
  ptr->method();
}

,我用一行字替换了它(就像我看到人们在Java中做的那样):

ptr && (ptr->method(), true);

从生成机器代码的角度来看,这是一个好的做法吗?还是我在二进制文件中引入了额外的常量?这个来自Java的"端口"可能会在我的程序中引起什么问题?

从生成机器代码的角度来看,这是完全无关的。如果这两种形式中的一种更好,而编译器的优化器不能将一种形式转换为另一种形式,那么它就不值得被称为"优化器",就这样。

这就只剩下了哪个更容易读的问题。第一个是显而易见的。第二个很容易让人花一分钟以上的时间来解析。不好。

还要注意,第二种情况可能会在操作符重载的情况下引入不想要的结果。如果operator ,method()返回的类型重载,它将在第二种情况下被调用,而不是在第一种情况下被调用。如果operator &&ptr类型重载,则第二种情况将失败,因为重载的&&不会惰性求值。但是,这两个操作符都属于强烈不建议重载的操作符。