从函数返回大对象:按值VS指针

时间:2013-08-28 05:50:09

标签: c++ function memory return return-value

函数会生成大对象。从函数中返回这些对象的最有效方法是什么?

  • 在堆栈上创建一个对象并按值返回

  • 在堆上创建一个对象,并将其包装在一个智能指针

我知道在第一种情况下,如果对象具有复制构造函数,则将执行命名返回值优化。所以它不应该是一个很大的性能问题。但是如果有很多这样的对象产生了堆栈溢出可能会发生。我在哪种情况下选择什么选项?

1 个答案:

答案 0 :(得分:1)

由于按值返回,您实际上不太可能遇到性能问题。请注意,您提到的NRVO只是编译器为优化代码所做的许多事情之一。

除非你有充分的理由使用指针,否则请避免使用它们。坚持使用自动存储时间的 对象,按照RAII并保持代码清洁 。一旦你创建了一些“大”对象,要小心你在应用程序中传递它们的方式(避免创建冗余副本),但除此之外,尝试提高性能所花费的额外努力很可能只是一个< strong> 过早优化

换句话说:而不是考虑“什么是更有效的方法?”只需编写一个尽可能正确和干净(易于阅读,易于理解)的代码 - &GT;在这种情况下,它可能意味着按值返回。如果你最终得到的效率不够高,那么就花点心思找出原因(但在这种情况下你将面临 特定问题 而不是 修辞问题 至少)。