2013-05-03 14 views
11

具有是(* I)。成員比異效率較低>構件

struct Person { 
    string name; 
}; 

Person* p = ... 

假設沒有運營商超載。


哪個更有效率?(如果有的話)?

(*p).namep->name

某處在我的後腦勺,我聽到了一些鐘聲,那*引用操作可以創建對象的臨時副本;這是真的?


這個問題的背景是類似案例:

Person& Person::someFunction(){ 
    ... 
    return *this; 
} 

,我開始懷疑,如果改變結果Person*最後一行簡單return this將使任何區別(在性能)?

+0

在這一點上,你應該更加擔心可讀性,而''>'是更常見的語法糖,'(* i).m'在很多地方都被忽視了。只有在任何分析表明可能存在與此相關的問題時,您才應該開始擔心其效率。 – PlasmaHH 2013-05-03 09:22:02

+3

我希望編譯器產生完全相同的結果。你可以自己回答這個問題,編譯兩個代碼到彙編器並檢查生成的代碼。 – bluehallu 2013-05-03 09:22:22

+0

我問過這個問題是因爲*我描述過的背景*許多基本的操作符通常會返回一個對自己的引用,而且我經常會看到它們返回'* this'; – 2013-05-03 09:23:45

回答

8

當您返回一個引用時,這與傳回指針完全相同,指針語義排除在外
您傳回sizeof(void*)元素,而不是sizeof(yourClass)

所以,當你做到這一點:

Person& Person::someFunction(){ 
    ... 
    return *this; 
} 

返回一個引用,並參考比一個指針的固有大小一樣,因此沒有運行時的差異。

也是一樣的使用(*i).name,但在這種情況下,你創建一個l-value,其中有那麼相同的語義參考(見here

+0

這是關於退貨規模的好處。你能解釋一下,'* p'做了什麼呢?它的結果是一個人&或人,或者const人&? – 2013-05-03 09:29:41

+0

如果我正確閱讀了http://stackoverflow.com/questions/11347111/dereferencing-a-pointer-when-passing-by-reference並根據維基百科獲得了一個'l-value',它引用了對象的地址: http://en.wikipedia.org/wiki/Value_(computer_science) – Gui13 2013-05-03 09:33:12

+0

有趣的讀取鏈接,謝謝:) – 2013-05-03 09:35:33

9

沒有區別。即使這個標準說這兩個是相同的,如果有任何編譯器不會爲這兩個版本生成相同的二進制文件,那就很糟糕。

+0

相同的內置類型和用戶定義? – 2013-05-03 09:22:11

+3

@KalamarObliwy假設沒有運營商超載,是的。 – 2013-05-03 09:22:40

+0

對於標準智能指針('std :: unique_ptr','std :: shared_ptr'),重載操作符仍然表現相同。 – MSalters 2013-05-03 13:00:12

1

任何好的編譯器都會產生相同的結果。你可以自己回答這個問題,編譯兩個代碼到彙編器並檢查生成的代碼。

+2

https://ideone.com/Ovj7ao – BoBTFish 2013-05-03 09:33:04

+0

@BoBTFish * voodoo * – 2013-05-03 09:45:26

2

是的,它更難閱讀和類型,所以你使用x->y(*x).y要好得多 - 但除了打字效率,絕對沒有差別。編譯器仍然需要閱讀的x值,然後添加偏移y,無論你用一個形式或其他[假設固然有沒有搞笑的對象/類涉及的是分別覆蓋operator->operator*,]

當引用(*x)時肯定沒有創建額外的對象。指針的值被加載到處理器[1]中的寄存器中。而已。

返回引用通常更高效,因爲它返回一個指向對象的指針(僞裝),而不是製作對象的副本。對於大於指針大小的對象,這通常是一個勝利。

[1]是的,我們可以爲沒有寄存器的處理器提供C++編譯器。我知道至少有一個來自Rank-Xerox的處理器,我在1984年看到它,它沒有寄存器,它是一個專用的LiSP處理器,並且它只有一個用於LiSP對象的堆棧......但它們遠不常見在現今世界裏。如果有人在沒有註冊的處理器上工作,請不要因爲我沒有覆蓋這個選項而低估我的答案。我試圖保持簡單的答案。

+3

-1不考慮處理器沒有r ...哦,等等。 :) – 2013-05-03 14:37:16