任何人都可以点比较轻松使用原子操作(尤其是C11/C++ 11码的性能基准测试结果memory_order_release和memory_order_acquire,也memory_order_consume和memory_order_relaxed)与默认memory_order_seq_cst?所有架构都很有趣.提前致谢.
C++ 的目标之一是允许用户定义的类型像内置类型一样表现良好。这似乎失败的一个地方是编译器优化。如果我们假设 const 非易失性成员函数在道德上等同于读取(对于用户定义的类型),那么为什么不让编译器消除对此类函数的重复调用呢?例如
class C {
...
public:
int get() const;
}
int main() {
C c;
int x{c.get()};
x = c.get(); // why not allow the compiler to eliminate this call
}
Run Code Online (Sandbox Code Playgroud)
允许这样做的论点与复制省略的论点相同:虽然它改变了操作语义,但它应该适用于遵循良好语义实践的代码,并在效率/模块化方面提供实质性改进。(在这个例子中,这显然是愚蠢的,但它变得非常有价值,例如,当函数被内联时消除冗余的迭代安全检查。)
当然,对于返回非常量引用的函数,仅对于返回值或常量引用的函数,允许这样做是没有意义的。
我的问题是是否有一个基本的技术论据反对这一点,但它并不同样适用于复制省略。
注意:为了清楚起见,我并不是建议编译器查看 get() 的定义内部。我是说 get() 本身的声明应该允许编译器省略额外的调用。我并不是说它保留了 as-if 规则;我声称,就像在复制省略中一样,在这种情况下,我们希望允许编译器违反 as-if 规则。如果您在编写代码时希望副作用在语义上可见,并且不希望消除冗余调用,则不应将方法声明为 const。