使用分配的局部变量来返回函数的值或直接使用函数

Sem*_*kül 2 c++ compiler-construction performance

这有什么区别:

MyClass c = getMyClass();
calculate(c.value);
Run Code Online (Sandbox Code Playgroud)

还有这个:

calculate(getMyClass().value);
Run Code Online (Sandbox Code Playgroud)

在性能和内存分配范围?

Pup*_*ppy 5

是的,存在相当严重的差异.在第一种情况下,c是左值,并且在范围结束之前不会销毁它.这可能会延迟reosurce清理等有用的事情.更有问题的是,它是一个左值意味着它不能被移动,但必须被复制,这对于许多类来说是低效的,但对于一些非常重要的类来说是完全非法的,例如unique_ptr.

在第二种情况下,编译器立即清理临时,因此所有资源都会立即释放,并且它是一个rvalue,使编译器可以更自由地优化并允许移动语义.

value成员或成员函数时,这仍然是正确的,因为两者都可以从其父对象继承值类别.

您应始终将对象范围限定为所需的最小范围,如果c以后不需要访问,则应使用临时对象.