2017-08-02 72 views
0

我用C++剛剛開始,我想知道,如果有一些指導各地時,做到以下幾點:C++:當通過指針回訪對象

比方說,我想返回一個結構或對象。在哪些情況下,哪種方法會更好?

void PopulateStruct(MyStruct* struct) { 
     struct->a = x; 
     struct->b = y; 
} 

void Caller() { 
    MyStruct s; 
    PopulateStruct(&s); 
} 

OR:

MyStruct PopulateStruct() { 
    MyStruct s; 
    s.a = x; 
    s.b = y; 
    return s; 
} 

void Caller() { 
    MyStruct s = PopulateStruct(); 
} 

我基本的理解是,如果結構/對象是非常小的,則後一種選擇可能是罰款(更好?),因爲副本將是快速和編譯器也說不定使用RVO來避免實際複製。

也許如果對象真的很大,那麼你希望前者避免該副本?

+0

如果現代編譯器沒有在每個可用的機會中利用RVO和NRVO,我會感到驚訝。所以在這方面,我認爲後一種方法在語義上更合理和可以理解。 – CoryKramer

+0

[返回值優化](http://en.cppreference.com/w/cpp/language/copy_elision)現在在許多情況下是強制/隱含的。 –

+0

可能的重複:https://stackoverflow.com/questions/33994995/which-is-more-efficient-return-a-value-vs-pass-by-reference – NathanOliver

回答

0

在現代編譯器中,返回對象可以用移動語義完成,即使沒有移動語義,它也足夠快。

這取決於您是否想要應用範圍銷燬或您希望程序員處理您要返回的對象的所有權。

+0

只有類型可以高效移動,移動語義纔有用。 – juanchopanza

1

根據Herb Sutter和Bjarne Stroustrup的CppCoreGuidelines,第二個例子是推薦的方法。它使代碼的推理更容易,並且不會強制您在某些情況下創建未初始化的對象。

請參閱準則F.20

返回值是自我記錄,而&可能是輸入輸出或只是外部輸入,可能會被誤用。

+0

完全同意可讀性(這是提出這個問題的動機)。我對性能方面很好奇,似乎這兩種情況應該與大多數編譯器同樣表現 –

+0

@AtulBhatia多年來,大多數編譯器通過在調用者的堆棧段中創建對象來優化返回。 C++標準特別允許這種優化。 – Galik