溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++中什么時(shí)候傳遞const參照

發(fā)布時(shí)間:2021-11-26 15:58:56 來(lái)源:億速云 閱讀:109 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“C++中什么時(shí)候傳遞const參照”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

對(duì)于輸入?yún)?shù)來(lái)說(shuō),拷貝代價(jià)小的傳值,其他傳遞const參照

Reason(原因)

兩種方式都可以讓調(diào)用者知道函數(shù)不會(huì)修改參數(shù)并且都可以通過(guò)右值初始化。

什么是“拷貝代價(jià)小”和機(jī)器架構(gòu)有關(guān),但是2到3個(gè)字(雙精度數(shù),指針,引用)通常最適合傳值。如果拷貝代價(jià)小,沒(méi)有方法可以超過(guò)拷貝的簡(jiǎn)單和安全,另外,對(duì)于小對(duì)象(不超過(guò)2到3個(gè)字)來(lái)說(shuō),由于函數(shù)不需要額外間接訪問(wèn),因此傳值會(huì)比傳址的速度更快。

Example(示例)

void f1(const string& s);  // OK: pass by reference to const; always cheap
void f2(string s);         // bad: potentially expensive
void f3(int x);            // OK: Unbeatable
void f4(const int& x);     // bad: overhead on access in f4()

(只)對(duì)于高級(jí)的用法,需要優(yōu)化為向輸入?yún)?shù)傳遞右值引用的情況有:

  • If the function is going to unconditionally move from the argument, take it by &&. See F.18.

    如果函數(shù)會(huì)無(wú)條件的移動(dòng)參數(shù)的內(nèi)容,使用&&。參考F.18

  • If the function is going to keep a copy of the argument, in addition to passing by const& (for lvalues), add an overload that passes the parameter by && (for rvalues) and in the body std::moves it to its destination. Essentially this overloads a "will-move-from"; see F.18.

    如果函數(shù)會(huì)管理一個(gè)參數(shù)的拷貝,除了使用功能const&(對(duì)于左值)以外,增加一個(gè)使用&&(對(duì)于右值)傳遞參數(shù)的重載函數(shù)并且在內(nèi)部使用std::move移動(dòng)參數(shù)內(nèi)容到目標(biāo)上。本質(zhì)上這個(gè)重載是一個(gè)“將要移動(dòng)形式”;參考F.18

  • In special cases, such as multiple "input + copy" parameters, consider using perfect forwarding. See F.19.

    對(duì)于

  • 特殊場(chǎng)合,例如多重“輸入+拷貝”參數(shù),考慮使用完美的forward。

Example(示例)

int multiply(int, int); // just input ints, pass by value
// suffix is input-only but not as cheap as an int, pass by const&string& concatenate(string&, const string& suffix);
void sink(unique_ptr<widget>);  // input only, and moves ownership of the widget

避免使用“只有高手才懂的技術(shù)”,例如:

  • Passing arguments as T&& "for efficiency". Most rumors about performance advantages from passing by && are false or brittle (but see F.18 and F.19).

    為了提高效率而使用T&&。許多通過(guò)傳遞&&獲得性能優(yōu)勢(shì)的傳言都是假的或者脆弱的。

  • Returning const T& from assignments and similar operations 

    通過(guò)復(fù)制或者類似操作返回const T&

Example(示例)

假設(shè)Matrix實(shí)現(xiàn)了移動(dòng)操作(例如使用std::vector保管元素)

Matrix operator+(const Matrix& a, const Matrix& b){    Matrix res;    // ... fill res with the sum ...    return res;}
Matrix x = m1 + m2;  // move constructor
y = m3 + m3;         // move assignment
Notes(注意)

返回值優(yōu)化不會(huì)處理賦值的情況,但是移動(dòng)賦值會(huì)。

可以假設(shè)引用參照的是有效對(duì)象(語(yǔ)言準(zhǔn)則)。不存在(合理的)“空引用”。如果需要可選值概念,使用指針,std::optional或者特殊值表示“沒(méi)有值”。

Enforcement(實(shí)施建議)
  • (Simple) ((Foundation)) Warn when a parameter being passed by value has a size greater than 2 * sizeof(void*). Suggest using a reference to const instead.

    (簡(jiǎn)單)((基本準(zhǔn)則)) 當(dāng)傳值的大小超過(guò)2*sizeof(void*)時(shí),報(bào)警。建議使用const引用。

  • (Simple) ((Foundation)) Warn when a parameter passed by reference to const has a size less than 2 * sizeof(void*). Suggest passing by value instead.

    (簡(jiǎn)單)((基本準(zhǔn)則))當(dāng)小于2*sizeof(void*)的參數(shù)使用const傳址時(shí),報(bào)警。

  • (Simple) ((Foundation)) Warn when a parameter passed by reference to const is moved.

    (簡(jiǎn)單)((基本準(zhǔn)則))當(dāng)使用const傳址的參數(shù)的內(nèi)容被移動(dòng)時(shí),報(bào)警。

“C++中什么時(shí)候傳遞const參照”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI