最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Effective C++ 第二十條 Prefer pass-by-reference-to-const to pass-by-

2023-01-20 10:40 作者:九思519  | 我要投稿

寧以 pass-by-reference-to-const 替換 pass-by-value

????????當(dāng)前有 Widget 和 SubWidget 兩個(gè)類,其中 SubWidget public 繼承 Widget

有一個(gè)函數(shù) call 輸出窗口信息,不改變窗口的任何內(nèi)容

????????在 case 1 中,方式一 和 方式二 的結(jié)果是一樣的,但是執(zhí)行效率卻不同,具體原理可以參考本集合(Effective C++ 讀后總結(jié))第十一章最后一段 by value 和 by reference。

??????????由此可知,當(dāng)傳入?yún)?shù)的類型占用內(nèi)存很大的時(shí)候,使用 pass-by-reference-to-const 要高效很多,就以本文的 Widget 為例,pass-by-value 需要?jiǎng)?chuàng)建一個(gè)副本,其需要調(diào)用一次 Widget 的拷貝構(gòu)造函數(shù),Widget 中有兩個(gè) STL 的 string,那么就是一共調(diào)用三次構(gòu)造函數(shù)和三次析構(gòu)函數(shù),開銷大小可想而知。而 pass-by-reference-to-const 就沒有這樣的開銷。自然,在傳入?yún)?shù)且不需要對(duì)傳入內(nèi)容進(jìn)行修改的時(shí)候,pass-by-reference-to-const 優(yōu)于 pass-by-value。但是也不是所有時(shí)刻都是如此。

????????SubWidget 中重載了 Widget 的函數(shù) fun(),兩個(gè)類的 fun 所執(zhí)行的功能不一樣,下面 case 2

????????執(zhí)行 case 2,發(fā)現(xiàn) call_21 輸出為 “Widget”,call_22 輸出為“SubWidget”. 造成這個(gè)現(xiàn)象的原因是對(duì)象切割(slicing)。前文說到, pass-by-value 是拷貝一個(gè)傳入對(duì)象的副本然后對(duì)副本進(jìn)行操作,由于函數(shù) call_21 定義的參數(shù)類型是 Widget 而非 SubWidget,所以拷貝副本也是拷貝的 Widget 而非傳入 w 的類型 (SubWidget)。所以調(diào)用的 fun 是 Widget::fun()。

????????pass-by-reference-to-const 是傳遞該對(duì)象地址來實(shí)現(xiàn)的(底層原理是這樣,引用和指針都是傳遞地址),不管你 call_22 所設(shè)定的參數(shù)類型是什么樣,只要在調(diào)用的時(shí)候放進(jìn)去的事 SubWidget 那么實(shí)際使用的就是 SubWidget,而非 Widget。

????????凡事也有例外,看起來 pass-by-reference-to-const 處處比 pass-by-value 優(yōu)秀,但是并不適合于 內(nèi)置類型、STL迭代器和函數(shù)對(duì)象 。下面貼一段代碼

使用 g++ -std=c++11 -g -o prog 編譯,然后使用 objdump -d prog > main.s

????????查看 main.s 中的 fun1、fun2、cmp 和 less

fun1 vs fun2 arm64

????????在 arm64 中,查看 pass-by-value 和 pass-by-reference-to-const 的匯編代碼,除去 ret 語句發(fā)現(xiàn)前者為 4 條語句,后者為 5 條語句,說明內(nèi)置類型 int 通過 pass-by-value 更快。

fun1 vs fun2 X86-64

????????在 X86-64 中,除去 ret 語句、 push %rbp 語句和 pop %rbp 語句,pass-by-value 使用 3 條匯編代碼,pass-by-reference-to-const 語句使用了 4 條匯編代碼,前者效率更高。

????????STL 迭代器在這里不做演示,很容易理解,因?yàn)?STL 的迭代器底層就是依靠指針來實(shí)現(xiàn)的,就是 pass-by-reference,只是不一定是 const 型。

????????下面對(duì)比 arm64 下 less(函數(shù)對(duì)象) 和 cmp(函數(shù))

arm64 fun3
arm64 fun4

????????對(duì)比之后發(fā)現(xiàn),fun3 除去對(duì)齊和返回三條語句,使用了 10 條匯編代碼,fun4 使用了 11 條匯編代碼,所以在 arm64 下對(duì)函數(shù)對(duì)象的傳入 pass-by-value 比 pass-by-reference 要高效。

????????至于 X86-64 如何留給看文章的讀者自己按照上述方式嘗試,然后測(cè)試結(jié)果。當(dāng)然,你也可以不看會(huì)匯編代碼,而是用C/C++提供的是時(shí)間函數(shù)庫測(cè)試分別調(diào)用所花費(fèi)的時(shí)間。

Effective C++ 第二十條 Prefer pass-by-reference-to-const to pass-by-的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
威海市| 阜新市| 河津市| 两当县| 米易县| 丁青县| 仁寿县| 公主岭市| 仪征市| 小金县| 屏边| 泗阳县| 新郑市| 怀化市| 始兴县| 仁化县| 洞头县| 枣庄市| 大埔区| 新民市| 修水县| 永宁县| 固镇县| 宾川县| 宁武县| 鲁山县| 广平县| 卫辉市| 开江县| 保定市| 松滋市| 龙胜| 东阿县| 马山县| 会宁县| 永春县| 赫章县| 昭苏县| 格尔木市| 泰宁县| 涿鹿县|