2013-08-28 84 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並保持您的代碼清潔。一旦創建了一些「大型」對象,請注意您在應用程序中傳遞它們的方式(避免創建多餘的副本),但除了嘗試提高性能所花費的額外努力很可能僅僅是一個不成熟的優化

換句話說:不要考慮「什麼是更有效的方法?」只需編寫一個儘可能正確和清晰(易於閱讀,易於理解)的代碼 - >在這種情況下,它可能意味着按值返回。如果你最終的解決方案,是不是足夠有效的,只要再花查明原因(但在這種情況下你將面臨的特定問題而不是反問努力至少)。