【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.mzph.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;包括离群值的识别与处理以及时间序列的建…