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)
在性能和内存分配范围?
是的,存在相当严重的差异.在第一种情况下,c是左值,并且在范围结束之前不会销毁它.这可能会延迟reosurce清理等有用的事情.更有问题的是,它是一个左值意味着它不能被移动,但必须被复制,这对于许多类来说是低效的,但对于一些非常重要的类来说是完全非法的,例如unique_ptr.
在第二种情况下,编译器立即清理临时,因此所有资源都会立即释放,并且它是一个rvalue,使编译器可以更自由地优化并允许移动语义.
当value成员或成员函数时,这仍然是正确的,因为两者都可以从其父对象继承值类别.
您应始终将对象范围限定为所需的最小范围,如果c以后不需要访问,则应使用临时对象.