C++
文章平均质量分 58
@Finish_all
一切都要慢慢习惯
展开
-
protobuf序列化原理、安装与应用
protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式,性能比json和xml真的强很多,毕竟google出品。原创 2023-04-19 17:11:17 · 460 阅读 · 1 评论 -
内存检测Valgrind与Gtest单元测试
TEST是gtest的测试宏,我们的测试用例必须按照这样格式写,isPrimeTest是测试套的名字,一个测试套下可以有多个测试用例,那么Positive、Trivial就是我们测试用例的名称,EXPECT_EQ、EXPECT_FALSE和EXPECT_TRUE等等,都是gtest提供的测试断言,比如 EXPECT_EQ(1, Factorial(1));用来检测c/c++程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。原创 2023-03-30 09:00:00 · 514 阅读 · 1 评论 -
memcpy函数底层实现
在实现memcpy的时候注意源地址和目的地址是否重叠,当源地址的尾部与目的地址头部重叠时,要从尾部开始拷贝。发现上图重叠时,我们要从尾部开始复制。原创 2023-03-27 19:35:42 · 1040 阅读 · 0 评论 -
高并发内存池设计(实现高效的内存管理)
在设计高并发内存池之前我们先了解一下什么是高并发。高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。响应时间短吞吐量大每秒响应请求数QPS 并发用户数高设计逻辑应该尽量简单,避免不同请求之间互相影响,尽量降低不同模块之间的耦合 内存池生存时间应该尽可能短,与请求或者连接具有相同的周期,减少碎片堆积和内存泄漏。原创 2022-10-11 14:01:39 · 1670 阅读 · 1 评论 -
左值引用与右值引用疑点总结
在C++11之前进行我们想要构造一个与A一样的B对象,我们需要重新分配一块内存,把A对象里面的资源拷贝到B里面,然后把A释放掉,这样就得到了一个与A一样的B对象。而在C++11 之后,通过移动构造和移动拷贝构造可以将A对象迁移为B对象,提高效率。想要右值引用引用左值,第一种方法可以将左值前加const,但是这样会有问题,我们希望通过引用可以修改变量值,如果左值前加上const,虽然能够被右值引用,但不能被修改。另外需要注意的是声明出的左值引用和右值引用都是左值。左值引用和右值引用区别。...........原创 2022-08-13 22:05:54 · 1849 阅读 · 0 评论 -
智能指针学习笔记
在C++ 11中引入智能指针的概念,使得C++程序员不需要手动释放内存智能指针的分类:unique_ptr, shared_ptr, weak_ptr注意:auto_ptr已经被抛弃C++指针包含两种原始指针智能指针:对原始指针的封装,其优点是自动分配内存,不用担心潜在的内存泄露。智能指针和原始指针的关系并不是所有的指针可以封装为智能指针,很多时候原始指针更方便各种指针中,最常用的是原始指针,其次是unique_ptr和shared_ptr。...原创 2022-08-03 22:28:11 · 835 阅读 · 3 评论 -
C++ return语句不返回任何东西(不是void类型)
下面直接上return结论吧!return语句有两种形式:不带返回值的return语句return;//不带返回值的return语句中断返回值为void类型的函数的执行。return;的作用相当于break;用于中断循环的作用。#include <iostream> using namespace std; void func(){原创 2022-05-17 20:42:33 · 1525 阅读 · 0 评论 -
Linux编程 Makefile常用知识点总结(项目管理)
目录Linux编程 Makefile(项目管理)1什么是 Makefile2 Makefile 文件命名和规则3 Makefile工作原理Linux编程 Makefile(项目管理)1什么是 Makefile一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也..原创 2022-05-02 12:00:00 · 1365 阅读 · 0 评论 -
GCC常用知识点
GCC常用知识点Ubuntu安装命令:sudo apt-get install gcc g++ 查看版本:gcc/g++ -v/--version要求版本大于4.8.5,不然不满足C++11新特性gcc编译命令:gcc test.c -o a.out//test.c为c代码文件,a.out为可执行文件其中可执行文件a.out后缀.out可以不要gcc test.c -o ag++编译器可以编译.c程序。gcc常用参数gcc编译选项说明-E预处理指定源文件原创 2022-04-27 21:43:38 · 2516 阅读 · 0 评论 -
linux开发环境搭建(VMware、Ubuntu安装,xshell安装与配置、VSCode实现远程开发)
linux开发环境搭建(C++)1、安装Ubuntu系统安装方法我就不说了,CSDN上一大堆。1.1 首先安装VMware,点击此链接获取1.2 VMware虚拟机上安装Ubuntu,点击此链接获取2、安装xshell和xftp。xshell是远程登录服务器的软件,xftp是文本传输软件。2.1 安装xshell和xftp软件下载:链接:https://pan.baidu.com/s/1k67WHJzWjm_Moaw8swDvRQ提取码:dtq7第一步:安装XmanagerPowerS原创 2022-04-27 18:40:04 · 1749 阅读 · 0 评论 -
C++编程: 内联(inline)函数与常量成员函数
🌍内联函数引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。...原创 2022-04-12 18:59:16 · 468 阅读 · 0 评论 -
C++ 编程的基本形式:文件名、防卫式声明、头文件布局
C++ 编程的基本形式:文件名、防卫式声明、头文件布局原创 2022-04-09 22:40:36 · 1004 阅读 · 1 评论 -
C++面对对象高级编程——复合、委托与继承
C++面对对象高级编程11——复合、委托与继承🌍复合、委托与继承本节主要探讨的是类与类之间的关系。包含Inheritance(继承)、Composition(组合)和Delegation(委托)三种关系。🌳**Composition(组合) **template<class T,class Sequence = deque<t>> class queue{......protected: sequence c; //底层dequed容器public: //原创 2022-04-05 10:25:53 · 685 阅读 · 0 评论 -
C++之快速理解指针常量与常量指针
C++之快速理解指针常量与常量指针指针常量:int * const p //指针常量常量指针:const int *p ; //常量指针快速的分辨方法:指针常量:const修饰p,p是个常量。所以说是指针常量。常量指针:const修饰int(在本例中),指针指向的是一个常量,指针本身是变量。快速理解:指针常量:本质就是一个常量,是一个指针类型的常量。特点是指针指向的变量的值可以修改,但是指向的地址不可以修改。另在一个重要的坑是,定义指针常量的时候必须初始化。指针常量也是常量,常量在定义的时候必原创 2022-03-06 14:11:27 · 533 阅读 · 0 评论 -
c++ map与unordered_map区别及使用
需要引入的头文件不同map: #include < map >unordered_map: #include < unordered_map >内部实现机理不同map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(原创 2021-11-23 17:44:37 · 96 阅读 · 0 评论 -
map/multimap容器
map/multimap容器map基本概念map中所有元素都是pair(成对)pair中第一个元素为key(键值),起到索引作用,第二个元素为value,是实值。所有元素按照元素的键值自动排序本质 : map/multimap属于关联式容器,底层实现通过二叉树实现优点:可以通过key值找到value值map和multimap区别:map不允许容器中有重复的key值元素multimap允许有重复key值元素map构造和赋值功能描述:对map容器进行构造和赋值操作构造:原创 2021-11-23 17:38:07 · 530 阅读 · 0 评论 -
4.5.2 左移运算符重载
4.5.2 左移运算符重载作用:可以输出自定义数据类型#include<iostream>using namespace std;class Person{public: //利用成员函数重载 左移运算符 p.operator<<(cout) 简化版本p<<cout //不会利用成员函数重载<<运算符,因为无法实现 cout在左侧 //void operator<<(cout) int m_A; int m_B;};原创 2021-10-05 10:30:17 · 82 阅读 · 0 评论 -
4 类和对象
4 类和对象C++面对对象的三大特性:封装、继承、多态C++认为万事万物都是对象,对象上有其属性和行为4.1 封装4.1.1 封装的意义封装是C++面对对象的特性之一封装的意义:将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限限制封装的意义一:在设计类的 时候,属性和行为写在一起,表现事物语法:class 类名{ 访问权限:属性/行为 };示例1:#include<iostream>using namespace std;//设计一原创 2021-10-05 10:34:08 · 83 阅读 · 0 评论 -
3 C++函数提高
3 C++函数提高3.1 函数默认参数在C++中,函数的形参列表中的形参是可以有默认值的语法:函数返回类型 函数名 (参数=默认值){ }示例1:#include<iostream>using namespace std;//函数默认值int func(int a, int b, int c){ return a + b + c;}int main(){ cout<<func(10, 20, 30)<<endl; system原创 2021-09-29 11:23:15 · 79 阅读 · 0 评论 -
C++引用
2 引用2.1 引用的基本使用作用:给变量起别名语法:数据类型 &别名 = 原名#include<iostream> using namespace std;int main(){ //引用基本语法 //数据类型 &别名 = 原名 int a = 10; // 创建引用 int& b = a; cout << "a = " << a << endl; cout << "b = " <<原创 2021-09-28 15:51:55 · 75 阅读 · 0 评论