您好,登錄后才能下訂單哦!
本篇內(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參照
兩種方式都可以讓調(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::move
s 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
返回值優(yōu)化不會(huì)處理賦值的情況,但是移動(dòng)賦值會(huì)。
可以假設(shè)引用參照的是有效對(duì)象(語(yǔ)言準(zhǔn)則)。不存在(合理的)“空引用”。如果需要可選值概念,使用指針,std::optional或者特殊值表示“沒(méi)有值”。
(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 move
d.
(簡(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í)用文章!
免責(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)容。