C++已經是一個多重泛型編程語言,同時支持程序形式、面向物件形式、函式形式、泛型形式和元編程形式的語言,
將C++視為一個由語言組成的聯邦而非單一語言,在其某個次語言中,各種守則和通例都傾向簡單、直觀易懂并且容易記住,然而當你從一個次語言移到另一個次語言時,守則可能改變,
4個次語言:
· C :C++是以C為基礎,區塊、陳述句、前處理器、內置資料型別、陣列和指標等都來自C,
· Object-Oriented C++ :classes,封裝、繼承、多型和virtual等,這一部分是面向物件設計之古典守則,
· Template C++ :C++的泛型編程部分,Template威力強大,它們帶來嶄新的編程范式,也就是所謂的TMP(模板元編程),
· STL :STL是個template程式庫,它對容器、演算法、迭代器以及函式物件的規約有極佳的緊密配合和協調,
C++高效編程守則視狀況而變化,取決于使用C++的哪一部分:
· 對內置型別(c-like)而言,pass-by-value通常比pass-by-reference高效,

圖1 Source-code

圖2 pass-by-value

圖3 pass-by-reference

圖4 pass-by-reference-to-const
可以看出,pass-by-reference(-to-const)相比于pass-by-value多了一步從暫存器中存放的地址取值的操作,
說明:
x86_64匯編:
傳參方法:第一個引數是rdi,第二個是rsi,第三個是rdx,第四個是rcx,第五個是r8,第六個是r9,再往后就在rsp堆疊往上存盤,回傳值是rax,
· 對于Object-Oriebnted C++來說,由于用戶自定義建構式與解構式的存在,pass-by-reference-to-const往往更加高效,運用template C++時更是如此,

圖5 source code

圖6 main
通過匯編代碼可以看到pass-by-value將類物件拷貝了一份,作為引數傳入的是這個拷貝產生的新的物件(呼叫了類默認的拷貝建構式),
· 對STL的迭代器和函式物件而言,舊式的C pass-by-value將再次適用,這是因為STL迭代器和函式物件都是在C指標之上塑造出來的,

圖7 source code

圖8 no_ref

圖9 has_ref
從匯編代碼可以看出來,對于指標型別入參,pass-by-reference相比于pass-by-value多了一次取值操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/239560.html
標籤:區塊鏈
上一篇:docker從入門到放棄一
下一篇:React編譯失敗npm ERR! Failed at the [email protected] start script.
