考慮這兩個函數具有不同的頭文件,但只有它們返回結果的方式不同(通過堆棧或指針):T f1(int x)
和void f2(int x, T *ret)
其中sizeof(T) >= 16
。 當調用f1
而不是調用f2
或像gcc -O2
這樣的編譯器將兩個調用優化爲類似結果時,是否會有任何性能損失。函數和性能的返回值
回答
從我看到的會有性能損失。對於f1,函數將不得不創建一個T類型的對象,然後它將返回該對象的一個副本,因爲您沒有指定它應該從引用或指針返回(但該函數將不得不分配內存爲了它)。
但是至於f2,你發送了一個你已經分配了內存的類型爲T的對象。這樣可以節省時間,因爲函數不必爲其創建新對象或分配內存。
儘管我不確定使用gcc 2級優化是否使用RVO來避免將對象作爲返回類型進行復制。
我不確定。因爲在堆棧中爲'f1'分配'T'只能通過改變「stackpointer」來完成。 – Cartesius00 2012-07-07 21:14:22
在C++ 11中移動語義使得* * * *語言*中的最佳*變得瘋狂。 – cha0site 2012-07-07 21:14:24
@ cha0site請不要C++。我們是純C的。 – Cartesius00 2012-07-07 21:15:52
- 1. 性狀作爲函數的返回值
- 2. 返回所有屬性值的函數
- 3. 功能的函數的返回值
- 4. 的Python:函數參數和返回值
- 5. C#類函數返回類(性能)
- 6. 返回另一個SETOF函數結果的SETOF返回函數的性能?
- 7. 函數不返回JSON屬性值 - node.js
- 8. 函數返回值
- 9. 返回函數值
- 10. 函數返回值
- 11. 函數的返回值返回undefined
- 12. PHP函數的返回值和例外
- 13. 返回地址和值的函數
- 14. 能量函數不返回值
- 15. VBA函數不能返回值主副
- 16. 擴展函數不能返回空值
- 17. Excel VBA - 值不能從函數返回
- 18. 不能使用函數返回值
- 19. 函數返回值(字符和整數)
- 20. 如何調整函數返回值的可能性(在AS3和C中)
- 21. 調用函數多次或儲存返回值,性能方面
- 22. 賦值函數返回值
- 23. crud函數的返回值
- 24. ajax函數的返回值
- 25. VB.NET函數的返回值
- 26. 函數== 0的返回值?
- 27. JavaScript函數的返回值
- 28. 角函數的返回值
- 29. 函數的返回值
- 30. 函數的const返回值
'f2'的調用者是否應該將'ret'作爲指向已經分配的某個指針的指針,但僅僅是默認的POD構造的(即未初始化的)地方,還是會涉及到一些非平凡的構造函數? – leftaroundabout 2012-07-07 21:10:16
@leftaroundabout沒有構造函數,預分配的空間。 – Cartesius00 2012-07-07 21:15:10
可能重複[是否更快速返回值或修改通過引用傳遞的參數?](http://stackoverflow.com/questions/7997569/is-it-faster-to-return-a-value-or-修改參數通過引用) – 2012-07-07 21:16:12