![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 70
乔以亦
这个作者很懒,什么都没留下…
展开
-
STL vector详解
本文参考vector源码,主要介绍vector的设计思路,了解一些方法的实现原理,内存机制。通过两个构造函数就可以知道,构造_Vector_base 时需要指定空间配置器同时也可以指定size,如果指定了size就会开辟sizesizeof(_Tp)这么大的空间,_M_start 指针指向这块空间的首地址,_M_finish 和_M_start 指向同一块地址(因为目前虽然开辟了空间但是并没有向vector中存入数据)。原创 2024-04-29 17:50:49 · 759 阅读 · 0 评论 -
C++单元测试Gtest+Stub攻略
笔者环境为linux环境(deepin),以下均在此环境进行。原创 2023-05-25 16:05:07 · 2171 阅读 · 2 评论 -
C/C++通过shapelib开源库读取shapefile文件
C/C++通过shapelib开源库读取shapefile文件原创 2022-11-07 10:23:51 · 1477 阅读 · 2 评论 -
C语言位域
在之前工作中从未使用过这种形式,可能是一个公司一个编码风格吧,现在的公司里面大量代码定义时候都使用到了位域,作者在网上搜了一点资料看了一下,记录一下自己简单的理解。在信息存储时,有时我们很确切的知道某个值的范围,我们就可以使用位域来限制这个变量的取值范围,并且能节省内存。使用位域时的意思是该变量仅占用数值对应值的比特位个数。并且数值对应值不应大于变量类型所占的最大比特位数。比如一个在结构体中有个值a取值范围是0-15那么我们在定义变量类型的时候就可以使用位域,使用位域可以节省内存空间,bc等值同理,为了方原创 2022-07-08 17:17:33 · 387 阅读 · 0 评论 -
在C/C++程序中执行终端命令并获取输出
在C/C++程序中执行命令并获取输出在程序中执行终端命令并获取输出大概有两个思路:1.在执行命令时将输出重定向到文件中,然后去读取文件获取命令行的输出,这样做的好处就是可以保留命令行输出到文件中,可以只管的看到命令行输出的结果。2.可以通过popen函数直接获取执行命令的结果,这样做没有中间产物不用读写文件代码量少清晰,如果是常规的项目需要这么做防止中间产物泄露。下面直接上代码:1.使用system重定向到文件中去:#include <QApplication>#include &原创 2022-04-02 17:22:19 · 6841 阅读 · 0 评论 -
Effective C++边读边记主要内容梳理持续更新中...
Effective C++第一章让自己习惯C++条款01:视C++为一个语言联邦条款02:尽量以const,enum,inline替换#define条款03:尽可能使用const第二章构造/析构/赋值运算第一章让自己习惯C++条款01:视C++为一个语言联邦这里主要将C++分成四个部分,每个部分都有各自的规则可能不同1.C语言部分2.Object-Oriented C++部分3.Template C++部分4.STL部分条款02:尽量以const,enum,inline替换#define1原创 2021-05-27 15:36:03 · 480 阅读 · 1 评论 -
C/C++预处理器,宏定义,宏函数浅析
C预处理器浅析C预处理器简介指令规则预编译指令预定义宏预处理器运算符宏定义注意事项C预处理器简介预处理器不是编译器的组成部分,他是编一过程中的一步,发生在编译之前。我们把C预处理器(C Preprocessor)简称为CPP。预处理的作用就是在代码被编译前对代码做某些替换。指令规则预处理指令的写法都是以#开头,#必须是该行第一个非空白字符,#和关键字之间允许存在任意个数的空白字符,接着是指令所需要的其他信息,整行够成了一条预处理指令。预处理指令总是在第一个换行符结束,除非明确的指明指令要继续。原创 2021-11-10 14:51:29 · 627 阅读 · 0 评论 -
C++ STL vector遍历方式及其效率分析
C++ STL vector遍历方式及其效率分析++i和i++区别下标遍历迭代器遍历for_each遍历总结++i和i++区别++i使用的是i执行完+1后的值可以直接使用,而i++是先使用i然后在对i进行+1这样就需要一个临时变量去进行转储,虽然只是一个简单的操作但是在循环中这一操作就会被循环次数而放大。如果i是一个简单的int型变量在很多编译器里面会优化这种写法,但是如果i是一个迭代器那么循环的性能就会收到影响,具体大小受到循环次数的约束。笔者亲测在QT中部分源码以及输出如下: std::vec原创 2021-10-19 13:42:13 · 2941 阅读 · 4 评论 -
C++ operator关键字浅析
C++ operator关键字的两个重要作用1.重载操作符2.操作隐式转换提到operator就不得不提到操作符(+=,=,==,<<,<…),我理解操作符本身就是函数实现的,由于日常使用operator关键字大多都是重载操作符,导致我们忽略了他的另一个重要作用–操作隐式转换。1.重载操作符在日常编码中operator关键字最常见的使用方式就是用它来重载操作符下面直接上例子:class persion{public: int age; bool sex;原创 2021-10-15 10:53:19 · 681 阅读 · 0 评论 -
Linux C/C++面试题汇总
Linux C/C++面试题汇总前言计算机基础程序的内存空间进程和线程相关关键字conststaticvolatileC/C++指针前言最近面试的比较多,看了很多关于面试的内容,有些平时工作用的比较少或者没有主要到的地方,长时间不看就会忘记,如果下次面试还需要再次找这些东西比较麻烦,所以写此篇文章就是为了方便以后面试,也给一些即将面试的人提供一些帮助。以后如果面试有新的值得关注的问题作者会及时更新。计算机基础程序的内存空间堆栈段(stack):由编译器自动分配和释放,存放函数的参数和局部变量。原创 2021-08-01 11:21:20 · 3648 阅读 · 0 评论 -
C++智能指针
C++智能指针全面解析前言auto_ptrunique_ptrscoped_ptrscoped_arrayshared_ptrshared_arrayweak_ptrintrusive_ptr前言C++中没有像Java一样提供自动回收机制,程序员想要操作堆内存只能使用指针通过new或者malloc开辟,delete或者free释放。在日常工作中经常出现程序员没有准确的释放内存,有可能导致内存泄露,或者调用了一块已经被释放的内存而出现种种问题。智能指针的出现有效的解决了这类问题。目前为止作者了解到的C+原创 2021-07-20 17:28:43 · 175 阅读 · 0 评论 -
C++类的成员函数做回调函数
C++类的成员函数做回调函数回调函数原理:通过函数指针的传递,使被注册的一方可以通过函数指针找到函数地址,从而实现调用注册进来的函数。C++成员函数和普通C函数的区别:C++成员函数隐藏传递一个函数参数(this指针),C++通过传递指向自己的this指针可以使成员函数访问自己的成员变量和成员函数。成员函数作为回调函数在注册毁掉函数时,由于隐藏参数this指针就会因为类型不匹配从而导致回调函数注册失败。在网上查询了一些资料可以通过以下几种方法实现成员函数作为回调函数:定义一个普通函数或友元函原创 2021-06-22 09:19:32 · 1001 阅读 · 0 评论 -
C++虚函数浅析
C++虚函数全面解析虚函数的工作原理:虚析构函数:C++中的静态联编和动态联编学习过C++的都知道可以通过虚函数实现多态。在基类中定义一个虚函数,在派生类中可以重写这个虚函数,实现派生类自己的特性。虚函数的工作原理:C++规定了函数名参数返回值,没有规定实现,可以根据需要自行实现内容。通常编译器处理虚函数的方法是给每个对象添加一个隐藏成员。该成员保存了一个指向函数地址的数组指针,这个数组指针也就是虚函数表。虚函数表中保存了对象中所有虚函数的地址(包括继承的基类的虚函数地址),如果派生类多重继承就会存在原创 2021-06-03 13:28:40 · 1861 阅读 · 3 评论 -
整数0强转成指针类型的巧妙操作
整数0强转成指针类型的巧妙操作在C语言中指针是一个整数相当于地址编号,如果给一个整数a强转成指针可以理解为该指针地址编号为a。下面就介绍下该方法应用在结构体中的巧妙之处。typedef struct{ int a; char b;}Msg;如上所示结构体Msg,如果将一个整数0强转成Msg可以理解为,Msg所在的首地址为0,那么((Msg *)0)->b,就可以理解为取结构体成员b的内容,但是我们自己知道其实0这个首地址并没有存储结构体Msg的信息,取内容也就毫无意义,所以我们不要取内容原创 2021-06-02 21:11:12 · 1953 阅读 · 0 评论 -
C语言结构体,共用体占用内存原理解析
C语言结构体占用内存原理解析结构体内存原理解析:共用体内存原理解析:结构体内存原理解析:结构体在内存中的存储有以下规则:结构体成员中的其实地址应该是该成员所占内存的整数倍,如果不足整数倍需要补齐结构体所占内存为结构体成员中最大基础数据类型的整数倍。这里说下基础类型:int,char,long,long long,double,float规则1解析:typedef struct{ char a; int b;}Msg;结构体Msg在内存中的存储方式如下图所示:a占用了第原创 2021-06-02 13:51:06 · 4042 阅读 · 6 评论 -
char data[0]在结构体末尾的巧妙用法
char data[0]在结构体末尾的巧妙用法在公司的项目代码中看见一个有趣的结构体如下:typedef struct{int Head;char data[0];}Msg;当时看到也是一脸雾水,后来在网上查找资料,发现了这一用法的奇妙之处。这一用法有如下好处:在结构体中但是并不占用内存。巧妙地将消息头和消息体连接在一起,并且可以直接取到消息体的首地址。这种用法一般都在消息传输时候定义消息头,里面包含后面消息体的长度,在接收完消息后可以按照解析完的消息头中的信息(比如消息长度、类原创 2021-06-02 12:46:33 · 690 阅读 · 0 评论 -
C++public、protected和private的区别
C++public继承、protected继承和private继承的区别学习C++这三个关键字是比较基础且常见的,下面先简单介绍下这三个关键字在类内的作用:public:公有的,说明声明在public后面的成员所有人都是可以使用的。protected:受保护的,类内和子类可直接访问,也就是说,基类中有protected成员,子类继承于基类,那么也可以访问基类的protected成员,要是基类是private成员,则对于子类也是隐藏的,不可访问private:私有的,只有类内的成员函数才可以访问。原创 2021-06-02 11:07:16 · 7180 阅读 · 0 评论 -
C++ explicit关键字
explicit用来防止由构造函数定义的隐式转换。直接上代码,比较简单。// An highlighted blockclass name{public: explicit name(int a) { qDebug("1111111"); } name(char a) { qDebug("222222"); } explicit name(const name &t){ qDebug("33333333"原创 2021-05-27 11:16:04 · 99 阅读 · 0 评论 -
C/C++编译过程
一个C/C++文件编译一般要经过,预处理,编译,汇编,和链接才能变成一个可执行文件预处理过程代码在编译前需要先扫描代码对其中的头文件,宏等进行初步替换,删除注释等操作,该过程不会做任何的语法检查,生成新的源代码提供给编译器,这个过程就是预处理过程。该过程是由预处理器来完成的。该过程将.c/cpp文件生成.i文件。.i文件是可以直接查看的。gcc -E -o hello.i hello.c编译过程预处理生成新的源代码后就可以进入编译过程,该过程会将C/C++语言翻译得到得到汇编语言代码。该过程会进行原创 2021-05-27 10:28:57 · 211 阅读 · 0 评论