
C/C++
文章平均质量分 81
king_weng
当才华配不上野心时,就静下心来学习吧!
展开
-
高速的C/C++编译工具——ccache
1、简介 ccache(“compiler cache”的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息, 比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。如果某头文件中包含对其他头文件的引用,ccache会用那个文件的 cpp-parsed版本来取代include声明,不是真正去读取、理解并解释其内容,ccache 只是将最终的文本拷贝到文件中,使得它可以立即被编译。ccache是以空间换取速度,ccache非常适合经常ma...原创 2021-05-31 14:24:01 · 28004 阅读 · 3 评论 -
C++11之lambda回调设置与应用
在程序中有时候我们需要实现回调效果,比如先设置监听,然后在后面具体执行完某个操作后再将该操作的结果通知给前面监听中。这种机制实际很常用,比如window底下的消息机制,Qt中的信号槽的机制都有类似的效果。但是在C++中并没有类似机制,那么我们应如何实现呢? 实际上在C++中我们可以使用模板、函数指针、抽象类、和lambda就可实现回调的效果,本文重点讲解如何使用lambda和function在同步线程中实现回调的效果。关于lambda介绍可参我前面的博客:https://blo...原创 2021-03-22 14:53:49 · 1395 阅读 · 3 评论 -
utest测试框架
一、utest测试框架简介1、简介 utest(unit test)是 RT-Thread 开发的单元测试框架。设计 utest 的初衷是方便 RT-Thread 开发者使用统一的框架接口编写测试程序,实现单元测试、覆盖测试以及集成测试的目的。2、utest 应用框图 如上图所示,测试用例基于测试框架 utest 测试框架提供的服务接口进行程序设计,支持将多个测试用例编译到一起进行测试。另外从图中可以看到,一个测试用例对应唯一的 testcase 函数,在 tes...原创 2021-03-09 10:58:54 · 4788 阅读 · 0 评论 -
跨平台C++单元测试框架——GTest
1、简介 GTest是google公司发布的一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架。它提供了丰富的断言、致命和非致命判断、参数化、死亡测试等等。 使用gtest时,就是编写断言(assertions),断言语句会检测条件是否为真。一个断言可存在三种结果:success(成功),nonfatal failure(非致命失败),或 fatal failure(致命失败)。当出现致命...原创 2021-03-02 17:12:02 · 2254 阅读 · 1 评论 -
纤程
1、定义 纤程是 fiber , 是由操作系统实现的一种轻量化线程上的一个执行结构。 通常是多个fiber共享一个固定的线程, 然后他们通过互相主动切换到其他fiber来交出线程的执行权.。各个子任务之间的关系非常强。 在Windows2000/XP中,纤程(fiber)相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber切换至另一合作纤程,以实现合作纤程之间的协同。2、优缺点(1)优点消耗小,切...原创 2021-01-29 16:08:22 · 1172 阅读 · 0 评论 -
C++中协程——State Threads
一、协程简介1、简介 协程(coroutine)不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。一个程序可以包含多个协程,可以对比与一个进程包含多个线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制。而协程也相对独立,有自己的上下文,但是其切换由自己控制,当前协程切换到其他协程由当前协程来控制。 协程调度单位减小到函数,上下文切换不需要内核参与,不存在系统调用。上下文切换开销降到最低,系统调用降到最低,没有锁竞争,没有信号处理。保留了程序...原创 2021-01-26 17:18:23 · 1857 阅读 · 1 评论 -
Linux中inotify详解及实例
1、inotify简介 用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,包括了hotplug、udev 和 inotify。Hotplug 是一种内核向用户态应用通报关于热插拔设备一些事件发生的机制,桌面系统能够利用它对设备进行有效的管理,udev 动态地维护 /dev 下的设备文件, Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建,以及卸载等操作,还可以跟踪活动的源头和目标等细节。即文件系统变化通知...原创 2021-01-05 17:21:00 · 4085 阅读 · 1 评论 -
C++中虚继承
一、虚继承和虚基类1、多继承产生的冲突 在C++中多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A-->B-->D 这条路径,另一份来自 A-->C-->D 这条路径。 在一个派生类中...转载 2021-01-06 09:25:14 · 7335 阅读 · 3 评论 -
gdb调试之快速入门
一、gdb调试1、gdb调试的三种方式目标板直接使用GDB进行调试。 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端。 目标板使用ulimit -c unlimited,生成core文件;然后主机使用xxx-linux-gdb ./test ./core。例子:(1)main.cpp#include "sum.h"using namespace std;int main(int argc, char *argv[]){ if(a原创 2020-10-14 17:22:22 · 897 阅读 · 0 评论 -
epoll及实例(二)
1、epoll工作原理 epoll通常使用epoll_ctreate()、epoll_ctl()和epoll_wait()这三个函数来处理epoll文件系统中的句柄资源。epoll无序遍历所有被侦听的句柄,只要遍历被唤醒而加入read队列的句柄即可,从而达到处理大量并发任务的能力。(1)epoll_create() int epoll_create(int size); 调用epoll_create()时会建立一个epoll对象/句柄(epoll文件系统会为此对象分...原创 2020-05-15 15:18:44 · 590 阅读 · 0 评论 -
C++模板特化和偏特化(二)
一、函数模板(1)函数的匹配优先级:普通函数; 重载函数; 普通函数模板; 全特化函数模板。 函数模板不允许使用偏特化,如有需求,改成模板函数的重载。(2)函数模板特化 函数模板特化主要的用途都是对于特定的类型,指定特定的处理方式。函数模板特化的意义在于如果有与实参更加匹配的特例化版本,编译器将会选择特例化版本。例:普通函数模板template<cl...原创 2020-04-07 14:17:19 · 563 阅读 · 0 评论 -
C++中typedef和模板能否同时使用
1、程序的处理的步骤 步骤 所进行的内容 生成的文件 预处理 展开头文件/宏替换/去掉注释/条件编译 “.i”文件 编译 检查语法,生成汇编 “.s”文件 汇编 汇编代码转换机...原创 2020-03-23 17:11:51 · 3230 阅读 · 0 评论 -
C++11之“=default” 和“=delete”
1、拷贝控制操作 拷贝控制操作有拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值运算符和析构函数。 如果一个类没有定义所有这些拷贝控制成员,编译器会自动为它定义(合成)缺失的操作,如定义一个合成拷贝构造函数、合成拷贝赋值函数等。因此,很多类会忽略这些拷贝控制操作。但是,对一些类来说,依赖这些操作的默认定义会导致灾难。2、使用=default...原创 2020-02-21 17:40:57 · 828 阅读 · 0 评论 -
设计模式之工厂模式
0、工厂模式类型 工厂模式就是用一个单独的类来做创造实例的过程,用来创造的其他实例的这个类即为工厂。工厂模式一般分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。1、简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(static Factory Method)模式,简单工厂模式是由一个工厂对象决定创建出来哪一种产品类的实例。简单工厂模式的实...原创 2020-01-11 16:06:17 · 217 阅读 · 0 评论 -
C++网络编程之poll
poll机制与select机制类似,通过管理文件描述符来进行轮询,效率更高,并且处理的连接个数不受内核的限制。1、poll函数# include <poll.h>int poll ( struct pollfd * fdarray, unsigned int nfds, int timeout);参数:(1)fdarray:可读套接字,是一个指向数组的...原创 2020-01-11 16:00:02 · 3538 阅读 · 0 评论 -
C++11异步操作(二)
1、async async是一个函数模板,用来启动一个异步任务,启动异步任务后,返回一个future对象。这个future对象里含有线程入口函数锁返回的结果(线程返回结果),可通过future对象的成员函数get()来获取。2、future(1)future: 将来的意思,提供了一种访问异步操作结果的机制,此结果可能没马上拿到,可在线程执行完毕后拿到...原创 2020-01-04 16:16:35 · 713 阅读 · 0 评论 -
C++中模板类和模板成员函数不能分开写
一个类一般都是在头文件(.h)中声明,在源文件(.cpp)中实现,但是在使用模板的时候,如果将模板成员函数分别放在头文件和源文件中则编译时会出现错误。错误原因是找不到链接。因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个头文件(.h)中。这就是为什么所有的STL头文件都包含模板定义的原因。当然如果一定要在源...原创 2020-01-04 09:43:06 · 2346 阅读 · 0 评论 -
C++中类的静态成员
1、C++中定义静态成员变量(1)静态成员属于整个类所有,不是隶属于某个对象所有;(2)静态成员变量的生命周期不依赖于任何对象,其生命周期如同全局变量一样,静态成员变量的生命周期是程序的运行周期;(3)可通过类名直接访问共有静态成员变量,静态成员变量也有访问等级;(4)所有对象共享类的静态成员变量,所以可通过对象名访问公有静态成员变量。2、静态成员变量的特性(1)在定...原创 2020-01-03 10:09:57 · 582 阅读 · 0 评论 -
C++智能指针之shared _ptr、weak_ptr、unique_ptr
一、class shared_ptr shared_ptr具有共享式拥有的概念。即多个shared_ptr可以指向相同的对象,该对象和其相关资源会在“最后一个引用被销毁”时释放。1、shared_ptr的初始化:(1)直接使用初始化shared_ptr<string> str(new string("name"));shared_ptr<strin...原创 2019-12-15 22:43:24 · 848 阅读 · 0 评论 -
C++多线程创建多法
0、class thread功能:创建线程 观察器 joinable 检查线程是否可合并,即潜在地运行于平行环境中 (公开成员函数) get_id 返回线程的id(公开成员函数) native_handle 返回底层实现定义的线程句柄(公开成员函数...原创 2019-11-27 20:37:57 · 387 阅读 · 0 评论 -
线程池和线程组及其实现
一、线程池1、线程池概念 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最...转载 2019-11-23 23:53:58 · 991 阅读 · 0 评论 -
C++11之lambda(二)
1、仿函数 仿函数(functor),即使一个类使用上看上去像函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类。仿函数的作用: 有时仿函数的使用是为了函数拥有类的性质,以达到安全传递函数指针,依据函数生成对象,甚至是让函数之间有继承关系,对函数进行运算和操作的效果。例:struct MyPlus{ ...原创 2019-11-23 21:12:53 · 179 阅读 · 0 评论 -
STL容器之unordered_map
1、定义 unordered_map为STL中的无序容器,其元素都是key/value pair,每个key只可出现一次,可作为关联式数组。而map则为有序容器。该容器定义如下:#include<unordered_map>template < class Key, // unordered_m...原创 2019-11-23 17:35:05 · 506 阅读 · 0 评论 -
C++中一个类中声明另一个类为友元函数
1、声明和定义 在使用友元函数之前需要先明白声明和定义的区别。 从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。2、(1)classA.h//#include "classB.h" // 错误,不可包含classB.h头文件,只需作前置声明即可class B;clas...原创 2019-11-04 11:12:12 · 2664 阅读 · 0 评论 -
C++11之function
1、std::function定义 类模板std::function是通用多态函数封装器。std::function的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、lambda 表达式、bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。 存储的可调用对象被称为std::function的目标。若s...转载 2019-09-08 15:51:14 · 3068 阅读 · 0 评论 -
C++中默认构造函数和构造函数初始化列表
1、默认构造函数和构造函数(1)构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void))。(2)默认构造函数:默认构造函数是在调用时不需要显示地传入实参的构造函数。一个类如果自己没有定义构造函数,则会有一个无参且函数体也是空的默认构造函数。只要程序员定义了构造函数,编译器就不会再提供默认构造函数了。定义默认构造函数有两种方式,...原创 2018-12-13 10:59:45 · 10177 阅读 · 3 评论 -
C++并发编程
1、<mutex> 头文件介绍 Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中。(1)Mutex 系列类(四种)std::mutex,最基本的 Mutex 类。std::recursive_mutex,递归 Mutex 类。std::time_mutex,定时 Mutex...原创 2019-09-22 17:55:24 · 365 阅读 · 0 评论 -
C++中析构函数为虚函数
1、析构函数是否定义为虚函数的区别(1)析构函数定义为虚函数时:基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。(2)析构函数不定义为虚函数时:编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析...转载 2019-04-12 23:13:17 · 23006 阅读 · 5 评论 -
JsonCpp的基本用法
1、JsonCppC++库,允许操作JSON值,包括与字符串串行化和序列化。它可在反序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的便捷方式。是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。JsonCpp(1.8.4版本):htt...原创 2019-03-12 21:55:19 · 39441 阅读 · 2 评论 -
C++中STL各容器详解
一、STL中六大组件:1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;2)迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以...原创 2019-03-09 17:10:57 · 7425 阅读 · 1 评论 -
C++中的异常处理
异常处理语法(1)throw语法:throw 表达式;(2)try语法:try 复合语句catch(异常声明) 复合语句catch(异常声明) 复合语句...2、解析各语句(1)throw:若某段程序中发现自己不能处理的异常,则可使用throw表达式来抛掷这个异常,将它抛掷给调用者。语法与return类似。(2)...原创 2019-01-06 14:55:16 · 511 阅读 · 0 评论 -
C++非类中和类中的static的作用
一、非类中的static1、隐藏 static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。2、保持局部变量持久性 在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序...原创 2018-11-15 09:41:01 · 389 阅读 · 0 评论 -
C++中带有默认参数的声明和定义。Qt中重写默认构造函数。C++中函数调用时实参个数和函数定义时的形参个数不一致时的处理。
1、Qt中自动生成的构造函数(1)Qt中自动生成的构造函数的声明class Chat : public QWidget{ Q_OBJECTpublic: explicit Chat(QWidget *parent = 0); //声明构造函数,可以带有初始值“=0”,表该参数为默认参数且调用时该参数可省略 ~Chat();private: Ui:...原创 2018-11-05 00:02:20 · 2932 阅读 · 0 评论 -
指针常量和常量指针的区别
(1)指针常量:顾名思义它就是一个常量,但是是指针修饰的。格式:int * const p //指针常量例:int a,b;int * const p=&a //指针常量//那么分为一下两种操作*p= 9; //操作成功p=&b; //操作错误,指针p将一直指向a,不能再指向b因为声明了指针常量,p代表一个指针地址,因此指针变量不允许修改...原创 2018-11-02 16:04:46 · 6313 阅读 · 1 评论 -
指针和引用的区别
1、指针和引用的区别(1)引用必须被初始化(引用类型的初始值必须是一个对象),指针不必(但最好要初始化)。(2)引用初始化以后不能被改变,指针可以改变所指的对象。(3)不存在指向空值的引用,但是存在指向空值的指针。(4)指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。(5)指针是一个对象,可以定义指向指针的...原创 2018-11-04 12:07:30 · 5680 阅读 · 0 评论 -
sqlite3入门基础、sqlite3常用函数
1、打开/创建一个数据库 int sqlite3_open(const char *filename, sqlite3 **ppDb );功能:打开数据库链接参数:filename:数据库的路径和文件名ppdb:数据库句柄。返回:成功 SQLITE_OK (值为0),否则返回其他值。2、回调函数执行sql语句int sqlite3_exec(sqlite3* pDB...原创 2018-11-04 11:57:27 · 8638 阅读 · 0 评论 -
C++中命名的强制转换
一、命名的强制类型转换的形式:cast-name<type> (expression) 其中type是转换的目标类型,expression是要转换的值。如果type是引用类型,则结果是左值。cast-name是static_cast、const_cast、reinterpret_cast、和dynamic_cast中的一种。1、static_cast...原创 2019-08-26 23:21:52 · 348 阅读 · 0 评论 -
C++11中的异步操作
异步操作的主要目的是让调用方法的主线程不需要同步等待调用函数,从而可以让主线程继续执行它下面的代码。因此异步操作无须额外的线程负担,使用回调的方式进行处理。在设计良好的情况下,处理函数可以不必或者减少使用共享变量,减少了死锁的可能。当需要执行I/O操作时,使用异步操作比使用线程+同步 I/O操作更合适。 异步和多线程并不是一个同等关系,异步是目的,多线程是实现异步的一...原创 2019-08-26 23:34:03 · 12370 阅读 · 3 评论 -
C/C++中访问可变参数列表,va_list、va_start、va_end和va_arg的使用
一、可变参数列表“...”的使用1、C语言提供了函数的不定长参数使用比如 void func(int a, …)。三个省略号,表示了不定长参数。注意:C标准规定了,函数必须至少有一个明确定义的参数,因此,省略号前面必须有至少一个参数。2、C++中可变参数模板// (1)template<typename... T> void func(T... args){}...原创 2019-08-27 15:02:31 · 1209 阅读 · 0 评论 -
C++模板特化和偏特化
1、模板特化的引入 使用模板时会遇到一些特殊的类型需要特殊处理,不能(或不希望)直接使用当前的模板版本时,所以此时我们就需要对该类型定义一个类或函数的特例化版本。例:当使用一个判断相等的模板函数时template<class T>bool Isequal(T& p1, T& p2){ return p1 == p2;} ...原创 2019-09-22 11:32:38 · 959 阅读 · 1 评论