C++ 围炉札记

news2025/1/6 18:25:47

在这里插入图片描述


文章目录

  • 内存检测
  • ProtoBuf
  • CMake、vscode、clion、Qt
  • 右值
    • 1、临时变量右值引用
    • 2、右值引用本质
  • 函数返回
  • std::function
  • POD(Plain Old Data)
  • thread_local
  • new / delete
    • 1、定位new运算符
  • 可变参数模板
  • typename和class
    • 1、C++模板类头文件和实现文件分离的方法
    • 2、函数显示实例化
    • 3、类显示实例化
  • 存储持续性、作用域和链接性
    • 1、const、volatile、mutable
    • 2、语言链接性
    • 3、Linux下so库的符号可见性
  • 友元与操作符重载
  • operator (转换函数、操作符重载、User-defined literals)
  • 继承与多重继承
  • RTTI
  • pair 和 tuple(元组)
  • 智能指针
  • constexpr
  • C++ 原始字符串
  • 异常


内存检测

Valgrind Home
valgrind简介与使用_WuYuJun’s blog的博客-CSDN博客_valgrind
内存检测王者之剑—valgrind - 知乎

Clang Sanitizers
编译器自带的调试神器sanitizers - 知乎
clang自己的一些sanitizer,可以借鉴_去级得骨灰的博客-CSDN博客
C++内存泄漏、数组越界……检测工具:Sanitizers_Owl丶的博客-CSDN博客_检查数组越界工具


ProtoBuf

深入 ProtoBuf - 简介 - 简书
GitHub - protocolbuffers/protobuf: Protocol Buffers - Google’s data interchange format
Protobuf 详解_Vic_Hao的博客-CSDN博客_protobuf
Protobuf的简单介绍、使用和分析_单飞的梦的博客-CSDN博客_protobuf
protobuf详解 - 知乎
深入 ProtoBuf - 编码 - 简书


CMake、vscode、clion、Qt

VSCode 和 CLion 探索
一文搞懂如何在CMake中使用Qt_Copperxcx的博客-CSDN博客_cmake qt
CMake 教程
Cmake官方教程解析


右值

左值引用和右值引用_陆尔尔的博客-CSDN博客_左值引用和右值引用
C/C++学习记录:std::move 源码分析_河边小咸鱼的博客-CSDN博客_c++ move源码

1、临时变量右值引用

    左值引用和右值引用都可以把临时对象的生命周期延长到与引用自身的生命周期相同。
说到实现,其实是变量替换,临时变量直接被构建在引用变量的位置,生命周期自然相同了。

T f() {
  return T{};
}
T&& a= f();
//a继续有效

被编译器看成

void f(T& temp){
  temp = ... 直接构造,不会走复制或移动构造函数
}
T a;
f(a);
//a继续有效。

2、右值引用本质

    看不出右值引用对普通基本数据有任何实际意义,但是大量文章使用基本数据来讲解,完全没有讲到有意义的点子上,这样过于简化讲解,容易误导、困惑初学者。右值引用真正用意,是用于解决类对象内部拥有的动态数据的回收(转移),提高程序运行效率。普通数据对右值引用的适用,仅仅是个副产品。

    我们再看一个移动构造函数的具体实现,方便大家理解move语义存在的价值:

class MyVector {
    int* data_;
    size_t size_;
 
public:
    MyVector(): size_(100) {
        data_ = new int[size_];
    }
 
    ~MyVector() {
        delete[] data_;
    }
 
    MyVector(const MyVector& my_vector) {                                       // Copy constructor
        size_ = my_vector.size_;
        data_ = new int[size_];
        std::copy(my_vector.data_, my_vector.data_ + my_vector.size_, data_);
    }
 
    MyVector(MyVector&& my_vector) {                                            // Move constructor
        size_ = my_vector.size_;
        data_ = my_vector.data_;
        my_vector.size_ = 0;
        my_vector.data_ = nullptr;
    }
 
    // Should define copy assignment operator here
 
    // Should define move assignment operator here
};
 
MyVector my_vector;
MyVector my_vector1 = my_vector;                                                // my_vector is lvalue, thus copy constructor is invoked.
MyVector my_vector2 = std::move(my_vector);                                     // std::move(my_vector) is rvalue, thus move constructor is invoked.

    这里,我们实现了一个简单的数组类,自定义了拷贝构造函数和移动构造函数。在拷贝构造函数中,把旧 data_ 数组中的每个元素依次赋值到新的对象中。在移动构造函数中,直接把旧 data_ 数组的指针赋值给新对象,从而避免了数据的拷贝。但移动后,需要把旧对象的 size_ 标记为 0,把 data_ 指针置空,以表示所有权的转移。这个简单的例子揭示了移动语义存在的价值,因为有些情况下,数据是可以转移所有权的,而不必拷贝一份。


函数返回

C++函数返回值作为左值问题 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园
C++primer第五版 函数返回左值_elma_tww的博客-CSDN博客_c++ 函数返回左值
c++ 函数返回引用_keyouan2008的博客-CSDN博客_c++ 返回引用
函数返回值的优化技术(RVO和右值引用)_werflychen的博客-CSDN博客_函数返回右值引用
返回值和右值引用的传递问题_章志强的博客-CSDN博客_返回右值引用
C++函数的返回类型声明为一个右值引用类型,会发生什么事情? - 知乎

char &change_value(string &str, int n) {
	return str[n];
}

std::function

std::function详解_在座的各位都是高手的博客-CSDN博客_std::funciton
std::function详解_A 壹零贰肆的博客-CSDN博客


POD(Plain Old Data)

C++中的POD类型_柚子树cc的博客-CSDN博客_c++ pod
c++中的POD类型 - 柳刚 - 博客园


thread_local

c++11: thread_local_zzhongcy的博客-CSDN博客_c++ thread_local
C++11 thread_local用法 - 知乎


new / delete

C/C++——new和delete的实现原理(详解)__BitterSweet的博客-CSDN博客_c++ new的实现
CC++中的new和delete的实现过程 - 百度文库
VS 反汇编方法及常用汇编指令介绍_超自然祈祷的博客-CSDN博客_vs反汇编

1、定位new运算符

C++定位new运算符 - 知乎
C++ 定位new运算符_Timplan的博客-CSDN博客_定位new运算符
定位new运算符_努力的小带土的博客-CSDN博客_定位new运算符


可变参数模板

可变参数模板(C++11)_tony__lin的博客-CSDN博客_可变参数模板
C++可变参数模板 - 知乎


typename和class

关于C++中模板中的typename和class的区别比较 - 百度文库
C++模板详解(一) - 百度文库
C++模板之typename和class关键字的区别 - CTHON - 博客园
C++函数模板及其实例化和具体化_Morning_Glory_JR的博客-CSDN博客_c++ 函数模板实例化
C++11函数模板的默认模板参数 - 云+社区 - 腾讯云
C++模板特化与偏特化 - 云+社区 - 腾讯云

template<typename T,typename U=double>
void testTemplateFunc(T t=0,U u=0) {
	cout<<"t="<<t<<" u="<<u<<endl;
}
 
// ================================================================
 
//函数模板
template<typename T, class N> void compare(T num1, N num2)
{
    cout << "standard function template" << endl;
    if(num1>num2)
        cout << "num1:" << num1 << " > num2:" << num2 <<endl;
    else
        cout << "num1:" << num1 << " <= num2:" << num2 << endl;
}
 
//对部分模板参数进行特化
template<class N> void compare(int num1, N num2)
{
    cout<< "partitial specialization" <<endl;
    if (num1>num2)
        cout << "num1:" << num1 << " > num2:" << num2 << endl;
    else
        cout << "num1:" << num1 << " <= num2:" << num2 << endl;
}
 
//将模板参数特化为指针
template<typename T, class N> void compare(T* num1, N* num2)
{
    cout << "new partitial specialization" << endl;
    if (*num1>*num2)
        cout << "num1:" << *num1 << " > num2:" << *num2 << endl;
    else
        cout << "num1:" << *num1 << " <= num2:" << *num2 << endl;
}
 
//将模板参数特化为另一个模板类
template<typename T, class N> void compare(std::vector<T>& vecLeft, std::vector<T>& vecRight)
{
    cout << "to vector partitial specialization" << endl;
    if (vecLeft.size()>vecRight.size())
        cout << "vecLeft.size()" << vecLeft.size() << " > vecRight.size():" << vecRight.size() << endl;
    else
        cout << "vecLeft.size()" << vecLeft.size() << " <= vecRight.size():" << vecRight.size() << endl;
}
 
// ================================================================
 
//类模板
template<typename T, class N> class TestClass
{
public:
    static bool comp(T num1, N num2)
    {
        cout <<"standard class template"<< endl;
        return (num1<num2) ? true : false;
    }
};
 
//对部分模板参数进行特化
template<class N> class TestClass<int, N>
{
public:
    static bool comp(int num1, N num2)
    {
        cout << "partitial specialization" << endl;
        return (num1<num2) ? true : false;
    }
};
 
//将模板参数特化为指针
template<typename T, class N> class TestClass<T*, N*>
{
public:
    static bool comp(T* num1, N* num2)
    {
        cout << "new partitial specialization" << endl;
        return (*num1<*num2) ? true : false;
    }
};
 
//将模板参数特化为另一个模板类
template<typename T, class N> class TestClass<vector<T>,vector<N>>
{
public:
    static bool comp(const vector<T>& vecLeft, const vector<N>& vecRight)
    {
        cout << "to vector partitial specialization" << endl;
        return (vecLeft.size()<vecRight.size()) ? true : false;
    }
};

1、C++模板类头文件和实现文件分离的方法

C++模板类头文件和实现文件分离的方法

// template_compile.h
template<class T>  
class base {  
public:  
    base() {};  
    ~base() {};  
    T add_base(T x,T y);  
};  
 
 
// template_compile.cpp
#include "template_compile.h"  
template<class T>  
T base<T>::add_base(T x,T y) {  
    return x+y;  
}  
 
 
// 在使用模板的测试文件use_template.cpp中:使用#include "template_compile.cpp"
#include<iostream>  
#include "template_compile.cpp"  
using namespace std;  
void main()  
{  
    base<int> bobj;  
    cout<<bobj.add_base(2,3)<<endl;  
} 

在使用模板的测试文件 use_template.cpp 中:使用 #include “template_compile.cpp”
   
或者把模块定义和实现都放在头文件中

【C++】类模板分离式写法_ainu412的博客-CSDN博客_分离式写类
C++模板(函数模板/类模板)_普通网友的博客-CSDN博客_c++函数模板

2、函数显示实例化

#include <iostream>
using namespace std;
template <typename T> void func(T t) {
    cout << t << endl;
}
 
 
// 函数模板显示实例化
// template [函数返回类型][函数模板名]<实际类型列表>(函数参数列表)
template void func<int>(const int&);

3、类显示实例化

#include <iostream>
using namespace std;
template <typename T> class A {
    T num;
public:
    A() {num = T(6.6);}
    void print() {
        cout << "A num:" << num << endl;
    }
}
 
 
//类模板的显示实例化
//template class [类模板名]<实际类型列表>
template class A<int>;

存储持续性、作用域和链接性

9.2.5 静态持续性、内部链接性_落雪snowflake的博客-CSDN博客
C++内部链接性和无链接性

1、const、volatile、mutable

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

语言链接性:

extern "C" void spiff(int);
extern void spiff(int);
extern "C++" void spiff(int);

2、语言链接性

在这里插入图片描述


3、Linux下so库的符号可见性

Linux动态库同名函数处理原则 - 百度文库
Linux下so库的符号可见性: 解决多个库同名符号冲突问题_glemo的博客-CSDN博客
linux 下同名符号冲突问题解决方案 | 函数


友元与操作符重载

C++友元函数和友元类(C++friend)详解 - 百度文库
运算符重载的非成员函数形式_Jaihk662的博客-CSDN博客_运算符重载为非成员函数
C++运算符重载为非成员函数
C++知识积累:成员函数运算符重载与非成员函数运算符重载_HerofH_的博客-CSDN博客_成员函数运算符重载


operator (转换函数、操作符重载、User-defined literals)

C++转换函数 (conversion function)_万里归来少年心的博客-CSDN博客_转换函数
c++重载操作符operator的用法_炎芯随笔的博客-CSDN博客
【c++】由构建复数类简析c++的user defined literal特性_ChillPolaris的博客-CSDN博客
User-defined literals (since C++11) - cppreference.com
C++ User-defined literals - 知乎


继承与多重继承

继承与派生(Part Ⅲ)——多重继承 & 虚基类_—Miss. Z—的博客-CSDN博客
虚基类(多重继承)_GoodLinGL的博客-CSDN博客_虚基类的继承


RTTI

C++ RTTI详解_彼 方的博客-CSDN博客_rtti


pair 和 tuple(元组)

C++ pair的用法_&Mr.Gong的博客-CSDN博客_c++ pair
c++ pair详解_lwgkzl的博客-CSDN博客_c++ pair
C++中的tuple(元组)_奋斗的小菜鸟!的博客-CSDN博客_c++ tuple


智能指针

C++智能指针详解:shared_ptr_吃素的施子的博客-CSDN博客_c++ shared_ptr
C++ shared_ptr用法、简析、案例_ve2102388688的博客-CSDN博客_c++ shared_ptr
C++ weak_ptr_L7256的博客-CSDN博客_c++ weak_ptr
C++智能指针weak_ptr详解_物随心转的博客-CSDN博客_c++ weak_ptr
C++智能指针unique_ptr 详解_物随心转的博客-CSDN博客_c++ unique_ptr
C++简单实现unique_ptr_吃米饭的博客-CSDN博客_c++ unique_ptr
【Qt】Qt中智能指针_iriczhao的博客-CSDN博客_qt 智能指针


constexpr

constexpr究竟有什么用? - 知乎
C++之constexpr详解_云洞的博客-CSDN博客_constexpr
constexpr_傻月菇凉的博客-CSDN博客_constexpr
C++ const 和 constexpr 的区别? - 知乎
C++11/14 constexpr 用法 - 简书


C++ 原始字符串

C++ 原始字符串_Niklaus9084的博客-CSDN博客_c++ 原始字符串


异常

C++的throw抛出异常机制
C++ throw抛出异常用法详解


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/987440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BT8959T2/5 LCD 驱动

1 Preface/Foreword LCD驱动路径&#xff1a;app/gui/lcd/ SDK默认的LCD驱动&#xff1a;lcd_gc9c01.c 2 数据结构 3 代码分析

高忆管理:科创板中签率?

科创板于当时已经成为出资者追捧的板块&#xff0c;许多新股都在科创板上市&#xff0c;那么科创板新股的中签率是高仍是低呢&#xff1f;是取决于哪些要素形成的呢&#xff1f;下面&#xff0c;本文将从多个角度剖析这个问题。 一、科创板中签率是什么&#xff1f; ​ 科创…

LeetCode 1126.查询活跃业务

数据准备 Create table If Not Exists Events (business_id int, event_type varchar(10), occurences int); Truncate table Events; insert into Events (business_id, event_type, occurences) values (1, reviews, 7); insert into Events (business_id, event_type, occu…

三段视频怎么合并在一起?三种方法教你快速合并

合并视频可以节省存储空间。如果我们有多个视频文件&#xff0c;每个文件可能需要一定的存储空间。但是&#xff0c;如果将它们合并到一个文件中&#xff0c;就可以节省存储空间并更轻松地管理文件。此外合并视频还使其更易于共享。如果需要将视频发送给其他人&#xff0c;您只…

Python实操:内存管理与优化策略

在 Python 开发过程中&#xff0c;合理有效地管理和优化内存使用是提高程序性能和效率的关键。本文将深入探讨 Python 中的内存管理机制&#xff0c;并分享一些实用的优化策略和具体操作步骤&#xff0c;帮助您更好地利用资源、减少内存占用并提升代码执行速度。 一、了解 Pyth…

【Python】【Fintech】解决用pandas_datareader从yahoo下载股票数据时出错

【背景】 要做一个预测投资组合portfolio未来收益的python脚本,类似的功能需要从数据源获取相关指数和股票的数据,一直以来都是用pandas_datareader从yahoo上面拿,但是后来忽然发现不能用了,这篇就说明一下遇到此问题的walk around. 【分析】 由于数据源是yahoo那边的,…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十二:通用详情组件封装实现

一、本章内容 本章实现通用详情组件,自动识别实体配置信息,并自动生成对应组件,填充组件数据,并完成数据自动加载等过程。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址࿱

Vue 前端项目使用alibaba矢量库svg图标

Vue 前端项目使用alibaba矢量库svg图标 这里主要是记录 vue项目中使用阿里矢量库图标的操作流程&#xff0c;方便以后查阅&#xff01;&#xff01;&#xff01; 一、简介 iconfont 是由阿里巴巴体验团队打造的&#xff0c;一款设计和前端开发的便捷工具.拥有着很强大且图标内…

手把手教你在视频剪辑及数字人训练中花式抠图

本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第三期&#xff0c;讲述围绕 视频剪辑及数字人训练中的抠图需求&#xff0c;如何运用 绿幕抠图、实景抠图能力&#xff0c;实现高效、便捷的视频制作及合成体验。 昱尘&#xff5c;作者 悬刃&#xff5c;算法支持 “你这背…

达梦数据库awr报告收集

1、找出快照点snap_id与时间的对应关系 SYS.WRM$_SNAPSHOT表中记录了快照点snap_id与时间的对应关系 例如如下语句可以得出2023-09-04这一天各个时间点对应的快照点snap_id select snap_id,end_interval_time from SYS.WRM$_SNAPSHOT where end_interval_time between to…

亚马逊鲲鹏系统多渠道引流功能快速增加你的listing流量

如果亚马逊Listing没有流量&#xff0c;那么亚马逊产品排名也会在很靠后的位置&#xff0c;从而就会导致吸引不到客户点击进行下单购买&#xff0c;因此引流就很重要了&#xff0c;普通的引流方法很难达到效果&#xff0c;并且还会花费大量的时间&#xff0c;那么我们可以用亚马…

Elasticsearch实现词云效果Demo

文章目录 前言前期准备springbootElasticsearch依赖 思路准备数据查询数据处理文本样式处理 具体实施数据准备创建索引数据存储进行查询 踩坑记录聚合查询不生效问题 demo地址总结 前言 最近项目中使用Elasticsearch在做快速查询的功能&#xff0c;然后就想到了之前的一个项目…

航空航天行业的MES系统解决方案

航空航天行业的制造执行系统&#xff08;MES&#xff09;解决方案是为了满足这个高度复杂、高度规定、高度技术要求的行业而设计的。MES系统在航空航天制造中发挥着关键的作用&#xff0c;帮助企业提高生产效率、降低成本、确保质量合规性&#xff0c;并实现生产过程的可视化和…

免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

基于SpringBoot+Vue实现的前后端分离的外卖点餐系统源代码+数据库

该项目是一个前后端分离的外卖点餐系统&#xff0c;项目后端采用SpringBoot开发。 完整代码下载地址&#xff1a;基于SpringBootVue实现的前后端分离的外卖点餐系统源代码数据库 功能模块 基础数据模块 分类管理员工管理套餐管理 点餐业务模块 店铺营业状态微信登录缓存商品…

数字孪生背后:谁在构建真实的数字世界?

如果说过去人们对于数字孪生的定位仅仅是真实世界的数字映像&#xff0c;那么如今&#xff0c;在映像之外&#xff0c;于众多的产业之中&#xff0c;它也更在通过更加复杂的设计和 技术成为现实世界的新数字调控器。 在这艘向前行进的航船上&#xff0c;改变的不仅是前方更加…

【录用案例】CCF-C类,1/2区SCIEI,3个月14天录用,30天见刊,11天检索

计算机科学类SCI&EI 【期刊简介】IF&#xff1a;5.5-6.0&#xff0c;JCR1/2区&#xff0c;中科院2区 【检索情况】SCI&EI 双检&#xff08;CCF-C类&#xff09; 【征稿领域】边缘计算、算法与机器学习的结合研究 录用案例&#xff1a;3个月14天录用&#xff0c;录用…

二维码智慧门牌管理系统:解决地理地址标准化的革新方案

文章目录 前言一、地理地址标准化难题二、地理地址标准化解决方案三、统一治理多源地址四、地址数据清洗和标准化五、提升协作和效率 前言 随着信息化社会的快速发展&#xff0c;各个业务系统都涉及地址问题&#xff0c;然而每个平台的地址规范又不统一&#xff0c;这给地址管…

最新报告!TikTok 市场小家电大商机,GMV破亿的爆款如何复制?

近期&#xff0c;新锐小家电品牌Gaabor空气炸锅在东南亚卖爆了&#xff0c;单款商品GMV短时间内突破两亿&#xff0c;在印尼、泰国、马来西亚、菲律宾、越南均开设本土TikTok 小店&#xff0c;增长势头还在持续。 但Gaabor并不是个例。 整个东南亚家电市场规模增长迅速&#…

vue3+ts+vite项目引入echarts,vue3项目echarts组件封装

概述 技术栈&#xff1a;Vue3 Ts Vite Echarts 简介&#xff1a; 图文详解&#xff0c;教你如何在Vue3项目中引入Echarts&#xff0c;封装Echarts组件&#xff0c;并实现常用Echarts图例 文章目录 概述一、先看效果1.1 静态效果1.2 动态效果 二、话不多数&#xff0c;引入 …