【C/C++】高階用法_筆記

1. 模板元編程(TMP)與編譯時計算

(1) 類型萃取與 SFINAE
  • 類型萃取(Type Traits):利用模板特化在編譯時推斷類型屬性。

    template<typename T>
    struct is_pointer { static constexpr bool value = false; };template<typename T>
    struct is_pointer<T*> { static constexpr bool value = true; };static_assert(is_pointer<int*>::value, "T must be a pointer");
    
  • SFINAE(Substitution Failure Is Not An Error):通過模板參數匹配失敗實現條件編譯。

    template<typename T>
    auto foo(T t) -> decltype(t.serialize(), void()) { /* T 有 serialize() 方法時調用 */ }template<typename T>
    void foo(...) { /* 默認實現 */ }
    
(2) 編譯時計算(constexpr 與模板)
  • constexpr 函數:在編譯期執行計算。

    constexpr int factorial(int n) {return (n <= 1) ? 1 : n * factorial(n - 1);
    }
    static_assert(factorial(5) == 120);
    
  • 模板遞歸計算

    template<int N>
    struct Factorial { static constexpr int value = N * Factorial<N-1>::value; };template<>
    struct Factorial<0> { static constexpr int value = 1; };
    

2. 移動語義與完美轉發

(1) 右值引用與移動語義
  • 避免深拷貝:通過移動構造函數和 std::move 轉移資源所有權。
    class BigData {BigData(BigData&& other) noexcept : ptr_(other.ptr_) { other.ptr_ = nullptr; }int* ptr_;
    };BigData a;
    BigData b = std::move(a);  // 觸發移動構造
    
(2) 完美轉發(Perfect Forwarding)
  • 保留參數類型:使用 std::forward 轉發參數到其他函數。
    template<typename... Args>
    void wrapper(Args&&... args) {target(std::forward<Args>(args)...);  // 保持參數的值類別(左值/右值)
    }
    

3. 智能指針與資源管理

(1) 所有權管理
  • std::unique_ptr:獨占所有權,不可復制,可移動。

    auto ptr = std::make_unique<int>(42);  // 推薦替代 new
    
  • std::shared_ptr:共享所有權,基于引用計數。

    auto ptr = std::make_shared<int>(42);  // 引用計數 +1
    auto ptr2 = ptr;                       // 引用計數 +2
    
  • std::weak_ptr:打破循環引用,避免內存泄漏。

    std::weak_ptr<A> weak = shared_ptr_A;
    if (auto spt = weak.lock()) { /* 安全訪問 */ }
    

4. 并發編程與原子操作

(1) 線程與同步
  • std::thread:跨平臺線程管理。

    void task() { std::cout << "Thread running\n"; }
    std::thread t(task);
    t.join();
    
  • 互斥鎖與條件變量

    std::mutex mtx;
    std::unique_lock<std::mutex> lock(mtx);  // RAII 風格鎖
    std::condition_variable cv;
    cv.wait(lock, []{ return data_ready; }); // 條件等待
    
(2) 原子操作(Atomic)
  • 無鎖編程:保證操作的原子性。
    std::atomic<int> counter{0};
    counter.fetch_add(1, std::memory_order_relaxed);
    

5. RAII(資源獲取即初始化)

  • 資源自動釋放:利用對象生命周期管理資源(如文件句柄、網絡連接)。
    class FileHandle {
    public:FileHandle(const char* filename) : file_(fopen(filename, "r")) {}~FileHandle() { if (file_) fclose(file_); }
    private:FILE* file_;
    };
    

6. 類型推導與現代語法

(1) autodecltype
  • 自動類型推導

    auto x = 42;          // x 為 int
    auto& ref = x;        // ref 為 int&
    const auto* ptr = &x; // ptr 為 const int*
    
  • decltype 推導表達式類型

    int a = 10;
    decltype(a) b = a;  // b 的類型為 int
    
(2) Lambda 表達式
  • 匿名函數對象
    auto lambda = [](int x) -> int { return x * 2; };
    std::vector<int> v = {1, 2, 3};
    std::transform(v.begin(), v.end(), v.begin(), [](int x) { return x + 1; });
    

7. 元編程庫與工具

(1) Boost 庫
  • Boost.Hana:現代 C++ 元編程庫。
    using namespace boost::hana;
    auto types = tuple_t<int, double, char>;  // 類型容器
    
(2) std::variantstd::visit
  • 類型安全的聯合體
    std::variant<int, double, std::string> v;
    v = 3.14;  // 存儲 double
    std::visit([](auto&& arg) { std::cout << arg; }, v);  // 訪問值
    

8. 高級調試與優化

(1) 自定義內存管理
  • 重載 new/delete
    void* operator new(size_t size) {void* p = custom_alloc(size);if (!p) throw std::bad_alloc();return p;
    }
    
(2) 內聯匯編與編譯器指令
  • 嵌入匯編代碼(需謹慎):
    int add(int a, int b) {asm("addl %%ebx, %%eax;" : "=a"(a) : "a"(a), "b"(b));return a;
    }
    

應用場景示例

  1. 高性能計算:利用模板元編程生成優化代碼,減少運行時開銷。
  2. 游戲引擎:通過移動語義高效管理資源(紋理、模型)。
  3. 分布式系統:使用原子操作實現無鎖數據結構(隊列、哈希表)。
  4. 嵌入式開發:通過 RAII 管理硬件資源(GPIO、定時器)。

注意事項

  • 可讀性平衡:避免過度使用模板元編程導致代碼晦澀。
  • 異常安全:確保資源在異常發生時正確釋放。
  • 跨平臺兼容性:注意不同編譯器對特性的支持差異(如 MSVC 和 GCC)。

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

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

相關文章

鴻蒙OSUniApp 實現一個精致的日歷組件#三方框架 #Uniapp

使用 UniApp 實現一個精致的日歷組件 前言 最近在開發一個約會小程序時&#xff0c;需要實現一個既美觀又實用的日歷組件。市面上雖然有不少現成的組件庫&#xff0c;但都不太符合我們的設計需求。于是&#xff0c;我決定從零開始&#xff0c;基于 UniApp 自己實現一個功能完…

PyQt5完整指南:從入門到實踐

引言 PyQt5是Python編程語言的一個GUI&#xff08;圖形用戶界面&#xff09;工具包&#xff0c;它是Qt5應用程序框架的Python綁定。Qt是一個跨平臺的C應用程序開發框架&#xff0c;被廣泛用于開發GUI程序和非GUI程序。PyQt5讓Python開發者能夠使用Python語言享受到Qt框架的強大…

Excel的詳細使用指南

### **一、Excel基礎操作** #### **1. 界面與基本概念** - **工作簿&#xff08;Workbook&#xff09;**&#xff1a;一個Excel文件&#xff08;擴展名.xlsx&#xff09;。 - **工作表&#xff08;Worksheet&#xff09;**&#xff1a;工作簿中的單個表格&#xff08;默認名…

Linux grep -r 查找依賴包是否存在依賴類 Class

方法一&#xff1a;通過 Linux &#xff0c;grep -r ClassPath 命令 grep -f org.apache.kafka.connect.source.SourceRecord在 jar 包所在 lib 或者 lib/plugins 目錄下執行&#xff0c;grep -r&#xff0c; flink-sql-connector-sqlserver-cdc-3.3.0.jar 中此 kafka Source…

碎片筆記|AI生成圖像溯源方法源碼復現經驗(持續更新中……)

前言&#xff1a;本篇博客分享一些溯源方法的復現經驗&#xff0c;希望能幫助到大家&#x1f389;。 目錄 1. Close-set AttributionRepmixDe-FakeDNA-Net 2. Open-set AttributionPOSE 3. Single-Model AttributionOCC-CLIPLatentTracer 1. Close-set Attribution Repmix 論…

SAP Fiori Elements Object Page

?? SAP Fiori Elements Object Page:魔法積木城堡的建造秘密 想象一下,你曾經去過一個神奇的樂高主題公園,在那里,城堡會根據你的設計圖紙自動搭建,而你只需要提供一張設計說明書,不必親自擺放每一塊積木!這就是SAP Fiori Elements Object Page的渲染魔法! ???♂…

Git 用戶名與郵箱配置全解析:精準配置——基于場景的參數選擇

目錄 一、配置查看&#xff1a;理解多層級配置體系二、精準配置&#xff1a;基于場景的參數選擇1. 倉庫級配置&#xff08;推薦&#xff09;2. 用戶級配置3. 系統級配置 三、歷史提交信息修改1. 修改最近一次提交2. 修改多個歷史提交&#xff08;危險操作&#xff09; 五、配置…

Fabric系列 - SoftHSM 軟件模擬HSM

在 fabric-ca-server 上使用軟件模擬的 HSM(密碼卡) 功能 安裝 SoftHSMv2 教程 SoftHSMv2 默認的配置文件 /etc/softhsm2.conf默認的token目錄 /var/lib/softhsm/tokens/ 初始化和啟動fabric-ca-server&#xff0c;需要設置一個管理員用戶的名稱和密碼 初始化令牌 # 初始…

醫學影像系統的集成與工作流優化

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…

轉發多臺px4仿真UDP數據到地面站

轉發腳本的任務需求 仿真采用UDP通信方式&#xff0c;在 wsl 中仿真三臺飛機&#xff0c;項目需要將一臺電腦中的三臺飛機的數據打包發送到另一臺飛機的地面站&#xff0c;但地面站是無法直接訪問另一臺主機的 wsl 中的端口的&#xff0c;wsl 中的端口需要本機才能訪問&#x…

FPGA圖像處理(五)------ 圖片水平鏡像

利用bram形成雙緩沖&#xff0c;如下圖配置所示&#xff1a; wr_flag 表明 buffer0寫 還是 buffer1寫 rd_flag 表明 buffer0讀 還是 buffer1讀 通過寫入邏輯控制(結合wr_finish) 寫哪個buffer &#xff1b;寫地址 進而控制ip的寫使能 通過狀態緩存來跳轉buffer的…

微服務八股(自用)

微服務 SpringCloud 注冊中心&#xff1a;Eureka 負載均衡&#xff1a;Ribbon 遠程調用&#xff1a;Feign 服務熔斷&#xff1a;Hystrix 網關&#xff1a;Gateway/Zuul Alibaba 配置中心&#xff1a;Nacos 負載均衡&#xff1a;Ribbon 服務調用&#xff1a;Feign 服務…

ESP32_IDF_OTA_HTTP升級固件

ESP32_IDF_OTA_HTTP升級固件 前言&#xff1a;一個項目的主控使用的是ESP32&#xff0c;因為封裝外殼的原因&#xff0c;所以需要采用OTA的方式進行升級&#xff0c;因為之前有對WIFI的OTA有所了解&#xff0c;所以在此基礎上&#xff0c;使用官方提供的native_ota_example例程…

MySQL表結構化:數據類型與表生命周期詳解

引言 各位數據庫學習者大家好&#xff01;今天我們將深入探討MySQL中最核心的對象——表&#xff08;Table&#xff09;的各類操作 &#x1f3af;。表是存儲數據的基石&#xff0c;就像Excel中的工作表一樣&#xff0c;但功能要強大得多&#xff01;無論是電商網站的用戶信息&…

React中的狀態管理Dva總結

在 React 開發中&#xff0c;隨著應用的復雜度增加&#xff0c;如何高效地管理應用狀態成為了一個非常重要的問題。為了解決這一問題&#xff0c;很多開發者選擇了 Redux&#xff0c;然而 Redux 的學習曲線較陡&#xff0c;且需要配置較多的樣板代碼。為此&#xff0c;Ant Desi…

數據結構中的高級排序算法

希爾排序 你可以將希爾排序理解成——先通過幾次分組的、較小的組間插入排序將原數組變得有序&#xff0c;最后再進行一次序列基本有序的完整插入排序。 #include <stdio.h>#define ARR_LEN(arr) (sizeof(arr) / sizeof(arr[0]))void print_arr(int arr[], int len) {for…

計算機視覺最不卷的方向:三維重建學習路線梳理

提到計算機視覺&#xff08;CV&#xff09;&#xff0c;大多數人腦海中會立馬浮現出一個字&#xff1a;“卷”。卷到什么程度呢&#xff1f;2022年秋招CV工程師崗位數下降了16%&#xff0c;但求職人數增加了23%&#xff0c;求職人數與招聘崗位的比例達到了恐怖的15:1&#xff0…

【Docker】Docker環境下快速部署Ollama與Open-WebUI:詳細指南

Docker環境下快速部署Ollama與Open-WebUI&#xff1a;詳細指南 在本篇文章中&#xff0c;我們將深入探討如何在Docker中高效部署 Ollama 和 Open-WebUI&#xff0c;并解決在實際使用中常見的問題&#xff0c;確保你的模型服務穩定高效地運行。 一、Ollama 和 Open-WebUI 快速部…

Vue3學習(組合式API——Watch偵聽器詳解)

目錄 一、Watch偵聽器。 &#xff08;1&#xff09;偵聽單個數據。 &#xff08;2&#xff09;偵聽多個數據。&#xff08;數組寫法&#xff1f;&#xff01;&#xff09; &#xff08;3&#xff09;immediate參數。(立即執行回調) &#xff08;3&#xff09;deep參數。(深層監…

SARIMA-LSTM融合模型對太陽黑子數量預測分析|附智能體數據代碼

全文智能體鏈接&#xff1a;https://tecdat.cn/?p41969 分析師&#xff1a;Peng Fan 本研究以太陽黑子活動數據為研究對象&#xff0c;旨在幫助客戶探索其未來走勢并提供預測分析。首先&#xff0c;通過對數據的清洗和處理&#xff0c;包括離群值的識別與處理以及時間序列的建…