簡體   English   中英

功能參數:復制還是指針?

[英]Function parameters: Copy or pointer?

我是C ++的新手並且有一些問題,這是其中之一。

有沒有什么理由當你使用一個函數來接受一個或幾個參數時,你知道的參數將始終存儲在函數調用之前的變量中,以傳遞變量的副本,而不是指向變量的指針?

我在談論表現。 在我看來,傳遞整個結構的副本而不僅僅是一個指針(4個字節)需要更多的資源。

有幾種方法可以傳遞副本比傳遞指針更便宜。

  1. 對象等於或小於指針。 直接訪問值總是比取消引用指針更快。
  2. 結構足夠小,可以由編譯器放在堆棧上。 在這種情況下,通過索引尋址模式而不是間接索引尋址模式來訪問結構中的值。 前者通常更快。

還有其他原因想要傳遞副本而不是引用,即您的函數將在結構中進行更改,而不會反映回調用者。 雖然這通常是一種不好的做法,但使參數按值傳遞將確保調用者的視圖不會被錯誤地更改。

現在對於你可能不想聽到的部分答案:它通常沒有那么大的差別! 使用對程序語義最有意義的參數傳遞方法。 如果您稍后發現特定區域存在性能瓶頸,那么請專注於提高性能。 不要過度優化!

通過指針(或引用)傳遞對象並傳遞同一對象的副本具有不同的語義。 如果您希望對對象進行的更改反映在函數調用之外,則需要引用語義,否則您需要值語義。

通常,值語義可以通過值傳遞值或通過const引用來表示

void value_semantics(my_obj obj);
void value_semantics(const my_obj& obj);

然而,const引用方式也有一些缺點,它會阻止編譯器可能進行的幾個優化,因為對於具有普通構造函數的對象的別名問題 ,額外的間接級別(引用被實現為指針)可能超過避免的好處副本。

為了獲得引用語義,您可以選擇通過引用傳遞或通過指針傳遞,因為其他人已經說過引用比C ++中的指針更自然(您不必使用運算符的地址& )以及指針的唯一真正優勢是否要啟用NULL值。

經驗法則是,對於非平凡的類,您應該通過const引用傳遞,否則通過值傳遞。

一個指針為bug打開,因為它允許被調用者改變對象。 指針可能為0,這往往會導致崩潰,這就需要在整個地方測試0指針,這可能很煩人。 使用C ++引用, const -declared盡可能避免這兩個問題。

避免使用pointer.Use常量引用if是IN參數否則只是IN OUT參數的引用

主要問題不是性能,而是語義,以及您的函數是否修改了結構中的數據。

如果您的函數修改了結構,那么傳遞指針將讓調用者看到結構中已更改的數據。 在這種情況下,傳遞副本可能是錯誤的,因為您的函數將修改一個然后(可能)丟棄的副本。 當然,您的函數可能會修改數據,但您不希望進行修改,在這種情況下,復制是正確的操作,以保護原始值不受更改的影響。

如果您的函數沒有修改結構,那么沒有理由復制值,因為它們只會被讀取。

如果你不熟悉將指針傳遞給結構的概念,你應該做一些練習,因為它是處理C和C ++結構的典型方法。

就性能而言,復制結構需要做更多的工作,但在方案中卻相當小。 首先要考慮代碼的語義。

引用更常見,如果它們不會改變,則引用const引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM