例:

A myfunction() { return A(); }
A a = myfunction(); // default ctor only (return value optimization)
a = myfunction(); // default ctor and operator=

为什么编译器不能只是将新对象写入现有对象?我相信一个类的所有实例都占用相同数量的(非动态)内存,所以我不明白为什么这会成为问题。

最佳答案

之所以会发生RVO,是因为C++标准为编译器提供了特殊的许可,可以忽略副本构造函数和临时构造函数的析构函数中的副作用,一旦应用了优化,就不会发生这种情况。

没有这样的特殊许 cocoa 以忽略赋值运算符中的副作用,因此不能忽略它。此外,由于a在分配给它之前是有效的,因此必须首先对其进行销毁,以便可以在适当的位置构造新对象。不仅没有特殊的许可来忽略此析构函数调用所带来的副作用,更糟糕的是,销毁必须在函数调用之前进行,如果函数抛出该函数,您将身在何处?

关于c++ - 为什么赋值运算符不会发生RVO? (C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20250043/

10-13 22:30