函数产生大对象。从函数返回这些对象的最有效方法是什么?
在栈上创建对象并按值返回
在堆上创建一个对象,并用智能指针返回它
我确实知道,在第一种情况下,如果对象具有复制构造函数,则将执行命名返回值优化。所以这应该不是一个大的性能问题。但是如果有很多这些对象产生堆栈溢出可能会发生。在什么情况下我该选择什么选项?
函数产生大对象。从函数返回这些对象的最有效方法是什么?
在栈上创建对象并按值返回
在堆上创建一个对象,并用智能指针返回它
我确实知道,在第一种情况下,如果对象具有复制构造函数,则将执行命名返回值优化。所以这应该不是一个大的性能问题。但是如果有很多这些对象产生堆栈溢出可能会发生。在什么情况下我该选择什么选项?
由于按值返回,您不太可能真正遇到性能问题。请注意,您提到的 NRVO 只是编译器为优化您的代码所做的许多事情之一。
除非您有充分的理由使用指针,否则请避免使用它们。坚持使用自动存储期限的对象,遵循RAII并保持代码干净。一旦您创建了一些“大”对象,请注意您在应用程序中传递它们的方式(避免创建冗余副本),但除此之外,尝试提高性能所花费的任何额外努力很可能只是为时过早优化。
换句话说:与其思考“什么是更有效的方法?” 只需编写尽可能正确和干净(易于阅读,易于理解)的代码 -> 在这种情况下,它可能意味着按值返回。如果你最终得到的解决方案不够有效,那就花精力找出原因(但在这种情况下,你将面临 具体问题 ,而不是 至少反问句)。