《More Effective C++》- 極精簡版 11-20條

????????本文章屬于專欄《業界Cpp進階建議整理》


????????繼續上一篇《More Effective C++》- 極精簡版 1-10條。本章我會繼續講解我對11-20條的極精簡的理解。

  • 11、不要讓destructor的異常流出
    • 先保障不會拋出異常,如果不能,就使用try catch,這里的注意catch里面不再拋出異常也需要人來保證
  • 12、拋出一個exception VS 傳遞一個參數 VS 一個虛函數之間的差異
    • 異常機制的個人見解異常機制核心收益是減少了用戶對三方庫的理解成本。在業務代碼中使用try-catch包住異常,以讓三方庫的異常在有限的范圍內,并且業務代碼的函數執行狀態由返回值表示。如果記不住繁瑣的異常機制,記住我說的這個原則就夠了。
    • 調用函數時,控制權會回到調用端,但是異常不會
    • exception objects總是被復制,如果以by value捕獲,會被復制兩次
    • throw 的exception對象,使用的靜態類型,而不是動態類型
    • catch子句,會在第一次匹配成功時執行
    • 虛函數總是找到最匹配的,而不是第一個匹配的
  • 13、以by reference方式捕捉exceptions
    • by point要擔心當前point是否可用
    • by value有復制成本
  • 14、明智使用excpetion specification
    • 個人見解:這個規則已經不適合c++11及之后的版本。忘記它,考慮第12條中我給出的建議
  • 15、異常處理的成本
    • exception是c++的一部分,即使你從未使用,只要有一個依賴庫用了,就有了一些成本。如果不要,需要對編譯器明確禁止
    • 整體try語句快,代碼膨脹5%-10%,速度下降5%-10%
    • exception成本較高,但是它出現的頻率是極低的,比正常情況慢3個數量級。
    • 注意,這個性能的變換,more effective cpp的作者也是根據部分測試結果來判斷的,它很難推斷,而是需要測試驗證。
  • 16、80-20法則
    • 用性能測試工具找到性能瓶頸,然后花80%的精力優化20%
  • 17、緩式評估
    • 寫時復制,如String s1 = "a"; String b = "a",編譯器可能會只有在b使用時,才進行真正的復制。這也是變量定義貼近使用句子的道理
    • 區分讀寫,cout << a[0]為讀,a[0] = 'a'為寫。operator并不能區分,但是通過proxy class可以做到(30條)
    • 個人見解:核心思想是,等到確定真正要用的時候才做計算。它并不能減少需要計算數據的計算量,而是盡量不做不需要結果的計算
      • 如矩陣的class operator* 并不是真正的相乘,而是記錄所需信息。而是在operator[],才真正的做計算
  • 18、分期攤還預期的計算成本
    • 當預期部分數據被頻繁需要時,提前計算。如vector每次預分配的內存,是當前的兩倍
  • 19、了解臨時對象的來源
    • 臨時變量不是局部變量,臨時變量并沒有名字
    • 兩種來源:隱式轉換作為函數參數、函數返回對象時
      • char* a = (str_ + "end").c_str(); a指向了一個臨時對象(注意不是局部變量),隨時可能改變
  • 20、協助完成“返回值優化”
    • 個人見解:在現代C++中,函數返回對象時,編譯器會先嘗試使用RVO,不行會先考慮使用移動構造函數,最后才是拷貝構造函數。所以,對于c++的默認對象或者小對象,直接返回,編譯器會幫助用戶只拷貝一次,對于大的對象建議還是在棧上申請,通過指針傳遞

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713281.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡(2)-----數據鏈路層

目錄 一.數據鏈路層的基本概念 二.數據鏈路層的功能概述 功能一:為網絡層提供服務。無確認無連接服務&#xff0c;有確認無連接服務&#xff0c;有確認面向連接服務。 功能二:鏈路管理&#xff0c;即連接的建立、維持、釋放(用于面向連接的服務)。 功能三:組幀 透明傳輸:…

ESU毅速丨不銹鋼材料為什么在金屬3D打印中的廣泛應用

不銹鋼是一種傳統且常見的材料&#xff0c;在金屬3D打印領域應用最廣。那么&#xff0c;為何不銹鋼材料在3D打印中如此受歡迎呢&#xff1f;以下是幾個關鍵原因。 卓越的工藝適應性 金屬3D打印技術&#xff0c;如直接金屬激光燒結&#xff08;DMLS&#xff09;和選擇性激光熔融…

Redis--持久化機制詳解

什么是redis持久化&#xff1f; Redis持久化是將內存的數據持久化到磁盤上&#xff0c;防止Redis宕機或者斷點的時候內存中的數據丟失&#xff0c;把內存中的數據寫入到磁盤的過程叫持久化。 Redis持久化的方式&#xff1f; RDB&#xff08;Redis DataBase&#xff09;&…

全量知識系統問題及SmartChat給出的答復 之10 三套工具之5語法解析器之3

Q27. 從前面可以看出&#xff0c;IPP解析器給出兩種文法規則&#xff0c;一種是人工的&#xff08;文字處理和文本理解&#xff09;&#xff0c;一種是機器的&#xff08;圖形算法和圖像處理&#xff09;。前者可以是一套文寫文章的注釋工具的底層&#xff0c;可以使用顏色來著…

Jmeter分布式部署

前期準備&#xff1a; 1. 控制機一臺&#xff0c;代理機一臺&#xff0c;Jmeter安裝包 操作步驟&#xff1a; 1. Linux安裝Jmeter&#xff08;windows安裝教程自己搜一下&#xff09; 1.1創建一個單獨的文件夾(jmeter)&#xff0c;用來存放Jmeter的安裝包 mkdir jmeter 1.2…

centos7升級openssl_3

1、查看當前openssl版本 openssl version #一般都是1.幾的版本2、下載openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解壓 tar zxf openssl-3.0.3.tar.gz#進入指定的目錄 cd openssl-3.0.33、編譯安裝遇到問題缺…

vscode設置打開瀏覽器

安裝這個插件 Open Browser Preview

全排列 全排列 II N皇后

46.全排列 力扣題目鏈接(opens new window) 給定一個 沒有重復 數字的序列&#xff0c;返回其所有可能的全排列。 示例: 輸入: [1,2,3]輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 遞歸終止條件&#xff1a;當收集元素的數組path的大小達到和nums數組…

CSP-201803-1-跳一跳

CSP-201803-1-跳一跳 解題思路 使用getline函數接收一行輸入&#xff0c;即玩家的跳躍序列。初始化總得分scoreSum為0&#xff0c;上一次得分lastGrade為2&#xff08;因為跳到中心的初始得分是2&#xff09;&#xff0c;以及一個布爾標志flag表示上一次是否跳到了中心&#…

Thinkphp框架漏洞--->5.0.23 RCE

1.Thinkphp ThinkPHP是一個免費開源的&#xff0c;快速、簡單的面向對象的輕量級PHP開發框架&#xff0c;是為了敏捷WEB應用開發和簡化 企業應用開發而誕生的。 2.漏洞原理及成因 該漏洞出現的原因在于 ThinkPHP5框架底層對控制器名過濾不嚴 &#xff0c;從而讓攻擊者可以通過…

lotus 從礦工可用余額扣除扇區質押

修改 miner配置文件 # Whether to use available miner balance for sector collateral instead of sending it with each message## type: bool# env var: LOTUS_SEALING_COLLATERALFROMMINERBALANCE#CollateralFromMinerBalance falseCollateralFromMinerBalance true質押金…

(Sora模型風口)2024最新GPT4.0使用教程,AI繪畫,一站式解決

一、前言 ChatGPT3.5、GPT4.0、GPT語音對話、Midjourney繪畫&#xff0c;文檔對話總結DALL-E3文生圖&#xff0c;相信對大家應該不感到陌生吧&#xff1f;簡單來說&#xff0c;GPT-4技術比之前的GPT-3.5相對來說更加智能&#xff0c;會根據用戶的要求生成多種內容甚至也可以和…

代碼隨想錄算法訓練營第10天| 232. 用棧實現隊列、225. 用隊列實現棧

232. 用棧實現隊列 題目鏈接 232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; 思路 記得是用兩個棧實現的隊列&#xff0c;但是細節記不太住&#xff0c;看了視頻才勉強縫縫補補做出來。 本人題解 class MyQueue { public:stack<int> stackIn;stack<…

【C語言】動態內存管理常用函數

前言 我們在之前學習的數組開辟的空間是固定不變的&#xff0c;有時候我們需要的空間??在程序運?的時候才能知道~ c語言中的動態內存開辟&#xff0c;讓程序員??可以根據實際需求申請和釋放相應空間&#xff0c;這使得空間的開辟變得靈活了許多。 歡迎關注個人主頁&#x…

小程序配置服務器域名的操作步驟(入門級)

將詳細列出小程序配置服務器域名的操作步驟&#xff1a; 服務器選購推薦&#xff1a;騰訊云輕量服務器 點擊以下任一云產品鏈接&#xff0c;跳轉后登錄&#xff0c;自動享有所有云產品優惠權益&#xff1a; 經過筆者親測&#xff0c;強烈推薦騰訊云輕量應用服務器作為游戲服…

微服務簡介及其相關技術棧

目錄 1、簡介 2、技術棧 3、單體架構 4、分布式架構 5、微服務 6、總結 &#x1f343;作者介紹&#xff1a;雙非本科大三網絡工程專業在讀&#xff0c;阿里云專家博主&#xff0c;專注于Java領域學習&#xff0c;擅長web應用開發、數據結構和算法&#xff0c;初步涉獵Pyth…

【QT+QGIS跨平臺編譯】之五十七:【QGIS_CORE跨平臺編譯】—【VECTOR_TILE生成】

文章目錄 一、protoc二、生成來源三、構建過程一、protoc Protocol Buffers(簡稱 protobuf)是一種輕量級、高效的數據序列化框架,它可以將結構化數據序列化為二進制格式,同時還可以進行反序列化和數據壓縮。相比于 XML 和 JSON 等傳統的文本序列化格式,protobuf 采用二進制…

wpa_supplicant交叉編譯

文章目錄 源碼編譯openssl編譯libnl交叉編譯WPA 開發板測試使用 源碼 wpa_supplicant官網&#xff1a;http://w1.fi/wpa_supplicant/ GIT源&#xff1a;git://w1.fi/hostap.git openssl 源碼&#xff1a; https://www.openssl.org/ libnl 源碼&#xff1a; https://github.c…

自定義preference的使用

自定義preference的使用 control_iconsize_preference_top.xmlcontrol_iconsize_preference_middle.xmlcontrol_iconsize_preference_bottom.xmlcontrol_iconsize_preference_airplane.xmlcontrol_iconsize_preference_no_arrow_top.xmlcontrol_iconsize_preference_no_arrow_m…

3 開源鴻蒙OpenHarmony4.1源碼下載、編譯,生成OHOS_Image可執行文件的最簡易流程

開源鴻蒙OpenHarmony4.1源碼下載、編譯&#xff0c;生成OHOS_Image可執行文件的最簡易流程 作者將狼才鯨日期2024-03-01 準備一臺Windows電腦 安裝VMware或者VMware Player虛擬機 從華為鏡像下載Ubuntu系統&#xff0c;用國內源下載速度更快 Ubuntu 鏡像說明https://repo.hu…