我想知道從函數正常返回值或使用指針作爲參數並將值傳遞給該指針會更快。返回值或使用指針參數的速度更快
回答
根據體系結構,指針長度爲4或8個字節。
如果您的值小於那個值,那麼傳遞值可能會更快。
如果您有大對象和複製構造函數,則會複製更多的內存並傳遞該類參數會更加昂貴。
但是......編譯器優化,內存對齊和其他巫術,可能需要您直接在您的案例中進行調查。
他們沒有問及傳遞價值。他們詢問是否返回值,或者傳遞指針作爲參數。 – juanchopanza
同樣適用於返回值。 –
通常情況下,返回值是用C++構造的,所以沒有昂貴的副本。 – juanchopanza
在不同的常見ABI中,大(不適用於寄存器)對象的返回值是通過指針實現的。調用者保留空間,並將指針傳遞給被調用者,該指針使用該指針創建對象。
返回一個'struct'實際上是一個隱藏的'memcpy',不是嗎? –
@FiddlingBits:它依賴於語言,在C++中可能(而不是C專家)在C++中,struct和一個類是相同的東西,在大多數情況下,memcpy不是正確的事情,編譯器贏了不行。在Itanium ABI中,通過調用者傳遞一個隱藏指針和被調用者創建'struct'的方式,返回一個* large enough *'struct'值。正如答案中所述。 「最先寫出最乾淨的代碼,然後測量它」,得到的值爲 –
在return by value
的情況下,假設調用者有一個要傳遞的對象,那麼編譯器將創建一個或多或少等價於pass by reference
的代價的參數副本。所以從性能角度來看,任何解決方案似乎都是等價的
我認爲我們在這裏談論的是C++11
,因爲它已經是2.x年了。
通過按值返回對象開始:移動語義,(N)RVO可以踢入並生成非常容易閱讀的非常快速的代碼。但是,如果您對代碼進行分析並發現此特定功能是瓶頸,請考慮將參考用作「超出參數」。這實際上可能比使用指針更快,因爲編譯器如何表示引用具有更大的靈活性。 C++的ISO標準並沒有規定引用需要存儲,所以編譯器可以自由地使引用成爲另一個內存位置的字面別名,使用有效的零字節開銷。
總而言之,先寫出最乾淨的代碼,然後測量它。人們低估了編譯器能夠爲你做多少優化,如果你只是按值返回你的(可移動的)對象。
+1。 – Cheeseminer
隨着現代編譯器和C++ 11通過返回值是最快在許多情況下:Want Speed? Pass by Value.(Archive)
Chandler Carruth有一個[talk](https://www.youtube.com/watch?v=eR34r7HOU14)深入探討了爲什麼以價值傳遞變量更快。 – sigod
- 1. 返回值或傳遞指針作爲參數?
- 2. 函數指針數組指針用作函數的返回值
- 3. C++ - 返回指針或const參考
- 4. golang:返回指針或傳遞參考
- 5. 從函數返回指針。值不更新爲一個指針
- 6. 用指針快速排序
- 7. 以更快的速度從MySql返回數據
- 8. C++返回指針值不可更改
- 9. 返回指向參考的指針
- 10. 快速.map函數不返回值
- 11. 返回指針數組的指針
- 12. 返回指針數組的指針
- 13. 數組:如何返回參考/指針
- 14. RSGetState in out參數返回空指針?
- 15. 將參數指針返回給對象
- 16. 返回值時的函數指針
- 17. 商店指針函數的返回值
- 18. 使用迭代器參數從模板函數返回指針
- 19. 函數是否可能使用其參數返回指針?
- 20. 指針錯誤返回值
- 21. 更改返回可變參數函數指針
- 22. C++哪個更快,返回函數中的值,還是使用引用參數?
- 23. 提取函數指針參數和返回值
- 24. 返回新分配的指針或通過參數更新對象?
- 25. 引用返回奇怪值的指針
- 26. 返回一個數組...而是一個參考或指向數組的指針
- 27. 返回指針數組(CvSeq指針)
- 28. 更改函數返回一個指針
- 29. 指針參數:返回指針或指針傳遞的地址的工作原理
- 30. 返回一個指針或用C
它可能是緩慢的量它被分配單獨也返回值,但差異並不顯着。就像返回結構一樣,結構的大小會變得更大。 – BLUEPIXY
你應該首先考慮你使用數據對象的多少,返回一個指針意味着在堆上分配,而堆內存開始時比較慢。因此,在某些情況下返回指針可能會更快,但如果使用該結構/對象則速度較慢,並且您使用它的次數會很多,所以您的微型優化是反生產力的。在調用函數中傳遞指向堆棧變量的指針可能會更快......但這是一種泛化,可能不適用於您的案例 –
描述您的特定情況。 – Enigma