《More Effective C++》- 極精簡版 1-10條

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


????????本文列出《More Effective C++》的1-10條的個人理解的極精簡版本。

  • 1、仔細區分pointers和references
    • 使用引用的情況:
      • 一旦代表的該對象就不能改變,應該選擇reference(優勢是使用時不需要判是否空)。
      • 實現一個操作符時,為了方便讀寫,返回引用
    • 其他任何時候,用pointers
  • 2、最好使用C++轉型操作符
    • 個人見解:在性能要求不高的地方盡量使用C++轉型操作符,以降低閱讀、維護成本。不在極高頻調用的代碼中使用,以降低機器成本
  • 3、絕對不要以多態方式處理數組(std::array)
    • 核心是不要在std::array中存派生類對象,然后傳給處理array[基類]的函數。因為傳入后,在以下兩個場景使用是有問題的
    • array遍歷元素,是按照指針類型做間隔(派生類比基類大,會導致偏移錯誤)
    • 通過基類指針刪除一個派生類構成的數組,在C++中是未定義的。
    • 常用的正確的做法是用vector,存儲基類指針(派生類對象永遠不要直接賦值給基類對象,會導致部分覆蓋)
    • 個人見解:在業務代碼中放棄使用std::array,固定長度的數組意味著一旦改變就意味著重啟。且在大部分場景性能收益不大
  • 4、非必要不提供默認構造函數(不要參數的,系統默認創建的構造函數)
    • 《more effective cpp》作者認為兩種情況下是必要的
      • A a[10],放在數組中,沒有辦法進行傳參初始化(不過這個場景并不常用,即使用,也是低頻場景,這個時候用,使用vector + for循環初始化,也是夠用的)
      • 基類沒有默認初始化函數時,派生類需要在構建時,需要顯示初始化基類
    • 個人理解
      • 同上一條類似,放棄a[10]這種原始數組,使用std::vector。
      • 做為基類,有一個默認構造函數,可以節省一些代碼,特別是繼承層數比較多的情況
  • 5、不要提供轉換函數
    • 單自變量的構造函數和隱式轉換操作符(如operator double()),會提供隱式轉換的功能
    • 盡量不要提供隱式轉換的功能,如在cout << a時,如果a本身沒有寫<<操作符,但是a能隱式轉換類型,則會先轉換類型,再調用該類型的 <<。這類操作很容易出現不符合預期的結果。
    • 用explicit來禁止,單變量的構造函數的隱式轉換
  • 6、區別++、--的前置和后置的區別
    • A& operator++() 返回自身。【前置++i】
    • const A operator++(int) 返回一個當前對象的copy,然后對自身對象+1。【后置i++】
    • 個人見解:在循環時,永遠使用前置。在業務邏輯中,不管是前置還是后置,都單獨寫一行,性能一樣,且代碼更易讀,放棄if(fun(a++))這種寫法。改為if(run(a)) & a++
  • 7、千萬不要重載 && ,|| 和,
    • 實際用的時候,期望 &&前面失敗后面就不執行,但是重載的時候做不到
  • 8、了解各種不同意義的new和delete
    • new
      • new operator:
        • 說明:語言內構建,不能被改變意義,總是做相同的事:1、分配足夠的內存 2、調用構造函數給分配的內存設定初值。可以改變實現方式,但是不能改變函數步驟和語義
        • 例子: A* a = new A();
      • operator new:
        • 說明:這是一個函數,可以被重寫或者重載,它除了內存分配,不會做任何事情,形式為:void* operator new(size_t size);
        • 例子: void* rawMemory = operator new(sizeof(A));
      • placement new
        • 將已有對象,構建在指定內存地址上
        • 例子:void *buffer = operator new(sizeof(int)); new (buffer) A a;
        • 這里獲取buffer時,調用一個 void* operator new(size_t)函數,得到一個內存空間
        • 然后調用void operator new(size_t, void* local) {return loacl},并在該函數返回的指針上面調用構造函數
    • delete
      • 當使用placement new時,要先調用析構函數,a->~A(); 然后再調用自己寫的函數,釋放內存,畢竟只有自己知道內存空間是如何創建的
    • 個人見解:放棄為了性能overwrite new/delete,使用tcmalloc或者jecmalloc。參考我的文章《c++的高性能內存管理庫tcmalloc和jemalloc》
  • 9、利用destructors避免泄漏資源
    • 本質就是把heap指針,放到棧上對象,保證釋放時,內存也會被釋放。如智能指針
  • 10、防止constructor泄漏資源
    • 本質相同,就是用stack對象管理heap對象,也就是對象的所有heap的成員對象,都用智能指針管理

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

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

相關文章

微信小程序的醫院食堂訂餐系統uniapp+vue+springboot/django/php

針對患者訂餐的管理現狀&#xff0c;本微信小程序的患者訂餐主要實現以下幾個目標&#xff1a; 1.系統界面簡潔&#xff0c;操作簡便。 2.擁有精準&#xff0c;高效的查詢功能。 3.能使管理人員能夠及時的獲得精確的信息。 4.對數據內容的管理安全&#xff0c;…

安卓websocket(客服端和服務端寫在app端) 案例

廢話不多說直接上代碼 首選導入 implementation "org.java-websocket:Java-WebSocket:1.4.0" package com.zx.qnncpds.androidwbsocket;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;import a…

騰訊:《智能科技 跨界相變——2024數字科技前沿應用趨勢》

1月23日&#xff0c;騰訊發布了題為《智能科技 跨界相變——2024數字科技前沿應用趨勢》的報告&#xff0c;報告從計算重塑、智能升維、沉浸交互、未來連接四個方面&#xff0c;對100多項未來技術和重點方向給出了趨勢性判斷。并表示我們正駛向一個由連接衍生交互、由計算催生智…

把簡單留給用戶,把復雜交給 AI

2024 年伊始&#xff0c;Kyligence 聯合創始人兼 CEO 韓卿&#xff08;Luke&#xff09;分享了對 AI 與數據行業的一些戰略思考&#xff0c;以及對中美企業服務市場的見解&#xff0c;引發業界同仁的廣泛共鳴。正值 Kyligence 成立 8 周年&#xff0c;恰逢 AI 技術應用風起云涌…

leetcode 2.29

Leetcode hot100 二分查找1. 搜索插入位置2. 搜索二維矩陣 二分查找 1. 搜索插入位置 搜索插入位置 標準二分的寫法&#xff1a; 復雜度分析 時間復雜度&#xff1a;O(log?n)&#xff0c;其中 n 為數組的長度。二分查找所需的時間復雜度為 O(log?n)。 空間復雜度&#xff1…

FLask會話技術和Flask模板語言

二、FLask會話技術和Flask模板語言 1.會話技術 cookie 客戶端的會話技術&#xff1a;讓服務器認識瀏覽器&#xff0c;常用于登錄 cookie本身由瀏覽器保存&#xff0c;通過Response將cookie寫到瀏覽器上&#xff0c;下一次訪問&#xff0c;瀏覽器會根據不同的規則攜帶cookie過…

ssm656基于JAVA的校園失物招領平臺的設計與實現

** &#x1f345;點贊收藏關注 → 私信領取本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345;** 一 、設計說明 1.1 課題…

(k8s中)docker netty OOM問題記錄

1、首先查看docker的內存占用情況&#xff1a; docker top 容器名 -u 查看內存cpu占用率&#xff08;容器名來自kubectl describe pod xxx或者docker ps&#xff09; 可以看出內存一直增長&#xff0c;作為IO代理這是不正常的。 2、修改啟動參數和配置文件 需要注意的是為了…

AI推介-多模態視覺語言模型VLMs論文速覽(arXiv方向):2024.01.01-2024.01.10

論文目錄~ 1.RoboFusion: Towards Robust Multi-Modal 3D obiect Detection via SAM2.Aligned with LLM: a new multi-modal training paradigm for encoding fMRI activity in visual cortex3.3DMIT: 3D Multi-modal Instruction Tuning for Scene Understanding4.Incorporati…

電子科技大學課程《計算機網絡系統》(持續更新)

前言 本校的課程課時有所縮減&#xff0c;因此可能出現與你學習的課程有所減少的情況&#xff0c;因此對其他學校的同學更多的作為參考作用。本文章適合學生的期中期末考試&#xff0c;以及想要考研電子科技大學的同學&#xff0c;電子科技大學同學請先看附言。 第一章 計算…

Unity - SerializeReference特性

作用&#xff1a;在編輯器面板上持久序列化一個接口或者抽象類對象 特點&#xff1a; 1.添加SerializeReference后, 即使字段是私有的, 也無需添加SerializeField屬性, 二者同有將私有字段序列化的能力. 2.SerializeReference屬性允許字段為null, 這點與默認序列化行為不同,…

Angular ts中監聽變量

這邊有個需求&#xff0c;需要監控某個input的變量變化&#xff0c;突然忘記怎么監聽變量了&#xff0c;查了下&#xff0c;記錄 這邊使用angluar/core中的OnChanges接口&#xff0c;然后實現 ngOnChanges方法&#xff0c;只要變量發生了變化&#xff0c;這里面都可以監聽到&am…

蘋果手機如何下載微信視頻號的視頻?親測可用的方法!

以下是如何下載微信視頻號的視頻的辦法&#xff0c;首先是視頻號下載提取器&#xff0c;下載視頻號視頻的&#xff01; 需配合微信PC版或者手機進行操作。這里以蘋果手機為例 首先&#xff0c;你需要在視頻號頻道找到你想要下載的視頻&#xff0c;然后通過點擊選擇你需要播放的…

[Android View] 可繪制形狀 (Shape Xml)

一切以官方文檔為主 官方文檔https://developer.android.com/guide/topics/resources/drawable-resource?hlzh-cn#Shape 什么是可繪制形狀 可以理解為用xml文件來描述一個簡單的Drawable圖形&#xff0c;比如說以下這段xml就可以用來描述一個白色的圓形&#xff1a; <?…

Centos中安裝Docker及Docker的使用

在centos7系統中安裝指定版本的docker,并通過docker使用安裝mysql為例,闡述docker的使用。 2.1、Docker卸載及安裝yum依賴 【卸載Docker,如果安裝的Docker的版本不合適】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

智能汽車軟硬件產品CES展示汽車技術新亮點

智能汽車是汽車產業發展的新趨勢&#xff0c;是未來汽車發展的必然方向。智能汽車是指搭載了先進的傳感器、控制器、執行器等部件&#xff0c;并融合了人工智能、自動駕駛等技術&#xff0c;能夠實現部分或完全自動駕駛、智能網聯等功能的汽車。 近年來&#xff0c;智能汽車技…

抖店怎么開店注冊?新手需要準備什么?這幾個步驟很關鍵!

我是電商珠珠 不少人瞄準了抖店這個短視頻電商勢頭&#xff0c;想要在今年大干一場。關于抖店注冊這方面&#xff0c;部分人還不太清楚&#xff0c;今天我就帶大家一步步注冊&#xff0c;看一遍就會了。 前期準備資料 前期新手的話&#xff0c;需要準備一張個體工營業執照&a…

Java實戰:Web實時消息推送技術

一、引言 隨著互聯網技術的飛速發展和用戶對實時交互體驗的追求&#xff0c;Web實時消息推送已成為眾多在線平臺的核心功能之一。無論是社交網絡的新消息通知、協同辦公工具的實時更新&#xff0c;還是電商平臺的訂單狀態變更&#xff0c;都需要實時、準確地將信息推送到用戶的…

【Java設計模式】二、單例模式

文章目錄 0、單例模式1、餓漢式2、懶漢式3、雙重檢查4、靜態內部類5、枚舉6、單例模式的破壞&#xff1a;序列化和反序列化7、單例模式的破壞&#xff1a;反射8、單例模式的實際應用 設計模式即總結出來的一些最佳實現。GoF(四人組) 書中提到23種設計模式&#xff0c;可分為三大…

B站畫質補完計劃(2):視頻超分讓像素細膩生動

本期作者 1 前言 為了給用戶提供更清晰的畫質體驗&#xff0c;B站自研的超分辨率算法已經在站內廣泛應用&#xff0c;支持了如《賽馬娘》、《流浪地球2》、《權力的游戲》、英雄聯盟S賽賽事直播等知名番劇、電影電視劇以及重要游戲賽事直播的 4K 視頻流生產。 2 超分算法的應用…