2012-07-07 40 views
-2

考慮這兩個函數具有不同的頭文件,但只有它們返回結果的方式不同(通過堆棧或指針):T f1(int x)void f2(int x, T *ret)其中sizeof(T) >= 16。 當調用f1而不是調用f2或像gcc -O2這樣的編譯器將兩個調用優化爲類似結果時,是否會有任何性能損失。函數和性能的返回值

+0

'f2'的調用者是否應該將'ret'作爲指向已經分配的某個指針的指針,但僅僅是默認的POD構造的(即未初始化的)地方,還是會涉及到一些非平凡的構造函數? – leftaroundabout 2012-07-07 21:10:16

+0

@leftaroundabout沒有構造函數,預分配的空間。 – Cartesius00 2012-07-07 21:15:10

+0

可能重複[是否更快速返回值或修改通過引用傳遞的參數?](http://stackoverflow.com/questions/7997569/is-it-faster-to-return-a-value-or-修改參數通過引用) – 2012-07-07 21:16:12

回答

0

從我看到的會有性能損失。對於f1,函數將不得不創建一個T類型的對象,然後它將返回該對象的一個​​副本,因爲您沒有指定它應該從引用或指針返回(但該函數將不得不分配內存爲了它)。

但是至於f2,你發送了一個你已經分配了內存的類型爲T的對象。這樣可以節省時間,因爲函數不必爲其創建新對象或分配內存。

儘管我不確定使用gcc 2級優化是否使用RVO來避免將對象作爲返回類型進行復制。

+0

我不確定。因爲在堆棧中爲'f1'分配'T'只能通過改變「stackpointer」來完成。 – Cartesius00 2012-07-07 21:14:22

+0

在C++ 11中移動語義使得* * * *語言*中的最佳*變得瘋狂。 – cha0site 2012-07-07 21:14:24

+2

@ cha0site請不要C++。我們是純C的。 – Cartesius00 2012-07-07 21:15:52