2013-08-28 82 views
0

函数产生大对象。从函数返回这些对象的最有效方法是什么?从函数返回大对象:通过值VS通过指针

  • 在栈上创建一个对象,并通过价值

  • 返回在堆上创建一个对象,并返回它包裹在一个智能指针

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

+0

@PW如果您阅读了该主题,您将意识到第二个选项不在那里。这里也没有涉及到SO的问题。 – Kolyunya

+0

第三个选项可能是:让你的对象变小,所以你不必担心SO(即使你不从函数返回,这可能是一个问题)。 – juanchopanza

+0

如果您需要返回派生类型的实例,请使用智能指针,[见](http://stackoverflow.com/questions/4809120/creating-and-returning-a-big-object-from-a-function) – cpp

回答

1

您很可能会因价值回报而遇到性能问题。请注意,您提到的NRVO只是编译器为优化代码而做的许多事情之一。

除非你有充分的理由使用指针,否则请避免使用它们。坚持具有自动存储时间的对象,请按照RAII并保持您的代码清洁。一旦创建了一些“大型”对象,请注意您在应用程序中传递它们的方式(避免创建多余的副本),但除了尝试提高性能所花费的额外努力很可能仅仅是一个不成熟的优化

换句话说:不要考虑“什么是更有效的方法?”只需编写一个尽可能正确和清晰(易于阅读,易于理解)的代码 - >在这种情况下,它可能意味着按值返回。如果你最终的解决方案,是不是足够有效的,只要再花查明原因(但在这种情况下你将面临的特定问题而不是反问努力至少)。