2014-02-10 25 views
0

我想知道從函數正常返回值或使用指針作爲參數並將值傳遞給該指針會更快。返回值或使用指針參數的速度更快

+0

它可能是緩慢的量它被分配單獨也返回值,但差異並不顯着。就像返回結構一樣,結構的大小會變得更大。 – BLUEPIXY

+0

你應該首先考慮你使用數據對象的多少,返回一個指針意味着在堆上分配,而堆內存開始時比較慢。因此,在某些情況下返回指針可能會更快,但如果使用該結構/對象則速度較慢,並且您使用它的次數會很多,所以您的微型優化是反生產力的。在調用函數中傳遞指向堆棧變量的指針可能會更快......但這是一種泛化,可能不適用於您的案例 –

+1

描述您的特定情況。 – Enigma

回答

0

根據體系結構,指針長度爲4或8個字節。

如果您的值小於那個值,那麼傳遞值可能會更快。

如果您有大對象和複製構造函數,則會複製更多的內存並傳遞該類參數會更加昂貴。

但是......編譯器優化,內存對齊和其他巫術,可能需要您直接在您的案例中進行調查。

+0

他們沒有問及傳遞價值。他們詢問是否返回值,或者傳遞指針作爲參數。 – juanchopanza

+0

同樣適用於返回值。 –

+0

通常情況下,返回值是用C++構造的,所以沒有昂貴的副本。 – juanchopanza

3

在不同的常見ABI中,(不適用於寄存器)對象的返回值是通過指針實現的。調用者保留空間,並將指針傳遞給被調用者,該指針使用該指針創建對象。

+0

返回一個'struct'實際上是一個隱藏的'memcpy',不是嗎? –

+0

@FiddlingBits:它依賴於語言,在C++中可能(而不是C專家)在C++中,struct和一個類是相同的東西,在大多數情況下,memcpy不是正確的事情,編譯器贏了不行。在Itanium ABI中,通過調用者傳遞一個隱藏指針和被調用者創建'struct'的方式,返回一個* large enough *'struct'值。正如答案中所述。 「最先寫出最乾淨的代碼,然後測量它」,得到的值爲 –

0

return by value的情況下,假設調用者有一個要傳遞的對象,那麼編譯器將創建一個或多或少等價於pass by reference的代價的參數副本。所以從性能角度來看,任何解決方案似乎都是等價的

1

我認爲我們在這裏談論的是C++11,因爲它已經是2.x年了。

通過按值返回對象開始:移動語義,(N)RVO可以踢入並生成非常容易閱讀的非常快速的代碼。但是,如果您對代碼進行分析並發現此特定功能是瓶頸,請考慮將參考用作「超出參數」。這實際上可能比使用指針更快,因爲編譯器如何表示引用具有更大的靈活性。 C++的ISO標準並沒有規定引用需要存儲,所以編譯器可以自由地使引用成爲另一個內存位置的字面別名,使用有效的零字節開銷。

總而言之,先寫出最乾淨的代碼,然後測量它。人們低估了編譯器能夠爲你做多少優化,如果你只是按值返回你的(可移動的)對象。

+0

+1。 – Cheeseminer

1

隨着現代編譯器和C++ 11通過返回值是最快在許多情況下:Want Speed? Pass by Value.Archive

+0

Chandler Carruth有一個[talk](https://www.youtube.com/watch?v=eR34r7HOU14)深入探討了爲什麼以價值傳遞變量更快。 – sigod