- 博客(45)
- 收藏
- 关注
原创 利用cmake和模板编程进行字节序转换
想利用模板编程进行编译期计算,想先判断主机字节序然后利用std::enable_if(C++17使用if constexpr)根据字节序是大端还是小端来判断是否进行字节序转换。但第一步编译期判断字节序不成功,因为union类型不能constexpr, 起对成员的选择访问是运行时的;而又不想运行时判断,所以要用其它方法代替。首先gcc编译器是有定义宏,考虑到平台扩展性还是选用了cmake的功能。
2023-05-11 21:54:31
590
原创 std::error_code的使用
定义自己的enum class:特例化std::is_error_code_enum:声明并实现std::error_code make_error_code(Your_Error_Enum):在头文件中声明:// .h文件 std :: error_code make_error_code(FlightsErrc);// .cpp文件 std :: error_code make_error_code(FlightsErrc errc) {
2023-05-02 23:26:25
1496
原创 std::regex
#include <regex>#include <string>#include <iostream>#include <thread>#include <fstream>#include <sstream>using namespace std;int main(){ //文本数据 string str = "1994 is my birth year 2000 dfsg"; //正则表达
2021-12-06 20:27:27
539
原创 《muduo学习》总结
析构的安全性在多线程中,两个裸指针指向同一个对象是不安全的,无法保证析构的正确性,一个线程在析构一个对象而同时另一个线程在使用它,即一个线程不能确定是否对象已经完全死掉,有可能另一处析构函数正在执行。shared_ptr可以保证在所有地方都不再使用时才释放,之前保证资源的有效性。2.shared_ptr的线程安全shared_ptr可以实现线程安全的释放对象,但shared_ptr本身不是线程安全的!如果一个shared_ptr对象可以被几个线程同时看到,那么读写这个对象就需要加锁!因为它内部有两.
2021-11-22 23:35:44
166
原创 CMake编译工程
CMake目录结构:项目主目录存在一个CMakeLists.txt文件两种方式设置编译规则:(1)包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可(2)包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中。编译流程(1)手动编写CMakeLists.txt(2)执行命令cmake PATH生成Makefile (PATH是顶层CMak
2021-11-15 23:03:57
910
原创 CMake 重要指令和常用变量
cmake_minimum_required: 指定CMake的最小版本要求cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])cmake_minimumrequired(VERSION 2.8.3)project: 定义工程名称,并可指定工程支持的语言project(projectname [CXX] [C] [Java])project(HELLOWORLD)set: 显式的定义变量set(VAR [VALUE]..
2021-11-15 22:51:09
907
原创 libevent文档学习注意点
Freeing a buffereventInterfacevoid bufferevent_free(struct bufferevent *bev);The bufferevent_free() function does, however, try to free the bufferevent as soon as possible. If there is pending data to write on the bufferevent, it probably won’t be flu.
2021-10-10 12:18:47
89
原创 类成员函数作为参数传递给模板函数
template<class T> void Call(T* ptr, int a, void(T::*MenFn)(int)) { (ptr->*MenFn)(a); } 1 class MyClass 2 { 3 public: 4 void Call(int a) 5 { 6 7 } 8 }; 9 10 MyClass cs;11 Call(&cs, 10, &MyCa
2021-10-05 11:51:22
772
转载 MySql MVCC
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入http://mysql.taobao.org/monthly/2017/12/01/欢迎使用Markdown编辑器你好
2021-09-13 21:48:27
543
原创 《Linux高性能服务器编程》笔记之System V IPC
1. semget系统调用 --> 创建一个信号量集#include <sys/sem.h>int semget(key_t key, int nsems, int semflag);key:整数类型键值,用来标识一个全局唯一的信号量集,就像文件名全局唯一标识一个文件一样。要通过信号量通信的进程需要使用相同的键值来创建/获取该信号量。key取值可以是IPC_PRIVATE(0值)或其它非零整数,当IPC_PRIVATE时创建一个仅能被进程使用的信号量。nsems:初始化信.
2021-03-09 22:59:11
134
原创 《Linux高性能服务器编程》笔记二
1. SIGPIPE信号当向读端已经关闭的管道或套接字中写数据会引发SIGPIPE信号,而该信号默认结束进程,而我们绝对不希望因为错误的写操作而导致程序退出,引起SIGPIPE信号的写操作设置errno为EPIPE。在代码中需要不会并处理该信号,至少需要忽略它。避免写操作触发SIGPIPE的方法:通过send函数的MSG_NOSIGNAL来禁止触发SIGPIPE信号,这种情况如果send返回-1,应该根据errno的值来判断管道或socket连接的读端是否已经关闭。还可以利用I/O复用系统调
2021-03-05 23:52:49
150
原创 《Linux高性能服务器编程》学习笔记
1. 监听socketint listen(int sockfd, int backlog);作用:创建一个监听队列来存放待处理的客户连接(在队列中就已经处于ESTABLISHED而不用accept返回以后)。backlog参数提示内核监听队列的最大长度,如果队列长度超过backlog,则不受理新的客户连接,和客户端也会收到ECONNREFUSED的错误信息。处于监听队列中的连接至少完成了三次握手中的两步,如果超出backlog的是SYN_RCVD,如果在backlog内则是ESTABLISHE
2021-03-01 00:20:47
296
原创 Linux Shell编程
1. 环境变量与本地变量VAR=Benson --> 此时VAR是本地变量,如果想让它变成环境变量需要再expotr VAR2. alias起别名alias pg='ps aux | grep'3. unset删除已定义的环境变量或本地变量4. 通配符*匹配0个或多个任意字符?匹配一个任意字符[若干字符]匹配方括号中的任意一个字符,可以[1-9]5. 命令代换由反引号 ` 括起来的也是一条命令,shell先执行该命令,然后将输出结果离开代换到当前命令行中。.
2021-02-11 14:37:01
265
原创 Linux网络编程之UDP与本地套接字
1. TCP与UDP的优缺点TCP:面向连接的可靠数据包传递。对复杂的网络环境完全弥补 优点:稳定。数据稳定,丢包回传(回执机制);传输速率稳定;流量稳定(滑动窗口) 缺点:效率低,速度慢 使用场景:大文件、重要文件传输UDP:无连接的不可靠报文传递。对复杂的网络环境完全不弥补。 缺点:不稳定。数据,速率,流量。 优点:效率高,速度快 使用场景:对实时性要求较高(视频会议、视频电话、广播等)。UDP也有可能出现缓冲区被填满后,再接收数据...
2021-02-09 22:41:41
363
原创 Linux网络编程之多路I/O复用
1. select函数#include <sys/select.h>int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);void FD_CLR(int fd, fd_set* set);int FD_ISSET(int fd, fd_set* set);void FD_SET(int fd, fd_set* set);void
2021-02-08 20:03:11
155
原创 《C++并发编程实战》在线程间共享数据
1. 共享数据的问题都是修改数据造成的,如果共享数据都是只读的,那就不会有问题因为一个线程所读取的数据不受另一个线程是否在读取相同的数据而影响。
2021-02-05 13:29:11
102
原创 Linux网络编程
1. 以太网帧格式目的地址 源地址 类型 数据(46 ~ 1500)类型为0800后面为IP数据报类型为0806后面为ARP请求/应答类型为8035后面为RARP请求/应答。2. ARP数据报:查找下一跳的mac地址,每一跳都会查看以太网帧和ip层。查看ip层根据当前路由器的路由表确定下一跳的ip,根据arp协议得到下一跳的mac。TTL:数据包的最大生命周期,以一跳为单位。3. NAT映射:路由器中还有一个NAT映射表,对应局域IP和公网IP的对应关系4. IP地址:在网络
2021-02-03 21:40:44
166
原创 Linux系统编程之线程同步
1. 互斥量操作函数pthread_mutex_t --> 锁类型初始化:int pthread_mutex_init(pthread_mutex_t* restrict mutex, const pthread_mutexattr_t* restrict attr);attr一般传入NULL。int pthread_mutex_destroy(pthread_mutex_t* mutex);pthread_mutex_t mutex = PTHREAD_MUTEX_INITI
2021-01-31 20:11:45
126
原创 Linux系统编程之线程
1.线程概念LWP:light weight process, 本质上仍是进程(在Linux环境下)进程:独立地址空间,拥有PCB线程:也有PCB,但没有独立的地址空间(共享)区别:在于是否共享地址空间。Linux下,线程是最小的执行单位;进程是最小的分配资源单位,可看成是只有一个线程的进程。2.Linux内核线程实现原理(1)轻量级进程,也有PCB,创建线程使用的底层函数和进程一样,都是clone;(2)从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页
2021-01-26 23:16:19
177
2
原创 Linux信号、进程间关系pause, 时序竞态,sigsuspend
1. pause函数 --> wait for signal该函数可以造成进程主动挂起,等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃CPU)直到有信号递达将其唤醒。int pause(void);返回值:pause() returns only when a signal was caught and the signal-catching function returned. In this case pause() returns -1, and errno is set
2021-01-21 23:30:21
448
原创 Linux系统编程之信号
1. 信号的特征:简单;不能携带大量信息;满足某个特设条件才能发送。2. 信号的机制: 进程收到信号后不管执行到程序的什么位置,都要暂停运行去处理信号,处理完毕再继续执行。与硬件中断类似,采用异步模式。但信号是软件层面上实现的中断,所以又被称作软中断。 由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性,但对于用户来说这个延迟时间非常短,不易察觉。 每个进程收到的所有信号,都是由内核负责发送的,内核处理。3. 产生信号的方式:按键产生:如 Ctrl + c...
2021-01-20 00:31:53
150
原创 Linux系统编程之mmap
1. void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);addr: 建立映射区的首地址,由Linux内核指定,使用时直接传递NULL;length:欲创建映射区的大小。prot: 映射区权限 PROT_READ, PROT_WRITE, PROT_READ | PROT_WRITEflags:标志位参数(常用于设定更新物理区域、设置共享、创建匿名映射区) MAP_SHARED: 会
2021-01-19 00:26:39
285
原创 Linux进程间通信IPC
1. 管道pipe (无名管道)本质是一个伪文件,实际为内核缓冲区。由两个文件描述符引用,一个表示读端,一个表示写端,数据单向流动。原理:管道实为内核使用环形队列机制,借助内核缓冲区(4K)实现。磁盘读写的单位是一个扇区,大小为512byte,即文件最小为512byte。局限性:数据自己读不能自己写;数据一旦被读走便不在管道中,不可反复读取;由于管道采用(单向)半双工通信方式,所以数据只能在一个方向上流动;只能在有公共祖先的进程间使用管道(有血缘关系)。int pipe(int pipe
2021-01-17 23:04:27
95
原创 Linux进程控制
1. fork函数pid_t fork(void);返回值有两个,返回子进程的pid-->父进程;返回0 --> 子进程;返回-1 --> error.
2021-01-16 23:26:57
117
原创 《C++并发编程实战》学习笔记 第二章基本线程管理
1. 线程函数中有传进来的引用或指针时需要注意引用或指针的有效性,尤其是线程detach以后,尤其是给线程函数传参或者lambda函数作为线程函数时捕获变量时,可以值拷贝(给线程函数传引用需要std::ref)。2. thread对象的析构函数会调用std::terminate(); 避免这种情况需要在thread对象析构前指定detach 或者join。当不需要和另一个线程交互时可以直接detach,例如在某位置需要等另一个线程结束,就需要在该位置join,例如新线程有本线程的指针或者引用,在销毁本线
2021-01-15 17:52:02
174
原创 Linux系统基本概念
1. 进程相关概念: 程序:编译好的二进制文件,存在于磁盘上,不占用系统资源(CPU,内存,打开的文件、设备、锁...); 进程:是一个抽象的概念,与操作系统原理联系紧密,进程是活跃的程序,占用系统资源,程序运行起来产生一个进程。同一个程序可以被同时加载成不同的进程(彼此互不影响)。2. 时钟中断:硬件手段3. 程序运行过程:存储介质: 硬盘 --> 内存 --> cache缓存 --> 寄存器(位于CPU)CPU: 预取器 --> 译码器 --&...
2021-01-14 23:28:13
248
原创 C库函数
1. 文件指针 FILE*, File其实是个结构体,内部主要包括:文件描述符:整型数值,用于索引到对应的磁盘文件文件读写指针位置:I/O缓冲区,为了减少操作硬盘的次数,提高I/O效率;数据写进文件在以下几种情况:刷新缓冲区fflush;缓冲区已满;正常关闭文件:fclose, main函数return,main函数exit2. 文件描述符:在程序的虚拟地址空间的内核区,有PCB进程控制块,内部有文件描述符表(大小为1024的数组)0: stdin, 1: stdout, 2..
2021-01-12 23:27:52
154
原创 Linux基础
1. 目录操作:mkdir 创建单个目录mkdir - p(parent): 创建多级目录rm -r: 删除目录cp -r 复制目录2. 软/硬链接ln -s 绝对路径 : 创建文件或目录软链接,注意要用绝对路径, 保存的是文件路径ln : 创建硬链接, 不能创建目录的硬链接2. 文件查找:文件名 文件大小 文件类型find 目录 -name "文件名" : 按照名字查找find 目录 -size -10K: 查找小于10K的文件find 目录 -size +10
2021-01-11 00:04:10
120
原创 随手记
1. 如果base class的构造函数中调用了虚函数,子类在构造时候调用的是谁的虚函数呢? 调用的是base class的虚函数,因为在子类构造时先调用base class的构造,此时子类还没构造,所以就是纯粹的父类的构造, 可以理解成此时vptr还是父类的虚函数表,子类的内容还没改呢。 而且在子类成员还没构造的时候也不能调用子类的方法。 可以说vptr一开始是父类的,在构造子类成员时才会检查虚函数表,对重写的进行替换。...
2020-12-16 21:51:58
101
原创 关于TCP的状态转换
服务器和客户端连接的socket pair和服务器和服务器本身用于listen的socket不同。最好服务器不要主动close与客户端连接的socket,因为主动关闭方会进入TIME_WAIT状态,导致在2MSL的时间内该socket pair的端口不可用,对于高并发短连接的服务器会导致大量端口不可用而总共可用的端口数是有限制的。...
2020-12-13 01:05:29
103
转载 C/C++函数名以及函数指针的区别
http://www.cnblogs.com/Esfog/archive/2012/04/23/2467249.html
2020-10-21 22:48:04
223
原创 2020-08-15
Linux 静态库: lib库名.a过程:先把.cpp编译成.o: g++ -c cpp文件将生成的.o生成静态库: ar rcs lib库名.a *.o使用需要库和.h文件:g++ -o 目标文件 库目录 源文件或者: g++ -o 目标文件 -L 库所在目录 -l 库名(掐头去尾,去掉lib和.a) 源文件Linux 动态库: lib库名.so过程:先把.cpp文件编译成位置无关的.o, 多一个 -fPIC命令: g++ -c -fPIC cpp文件将生成的.o文件编译成动态库: g+
2020-08-15 22:58:05
57
转载 c++中为什么可以通过指针或引用实现多态,而不可以通过对象呢?
https://www.cnblogs.com/yinheyi/p/10525543.html
2020-07-26 22:12:36
213
转载 std::move转换所有权
在C++11中,标准库在中提供了一个有用的函数std::move,std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue); 作用是:转换所有权,注意是转换,不发生深拷贝!std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值 右值 引用 左值引用)概念 https://blog.csd
2020-06-01 22:27:20
711
1
原创 右值引用T&&
左值与右值左值:表达式结束后仍存在的持久对象;右值:表达式届时后就不再存在的临时对象。包括将亡值和纯右值。将亡值:T&&函数返回值,std::move返回值,将要被移动的对象等。纯右值:非引用返回的临时变量,运算表达式产生的临时变量,原始字面量和lambda表达式等右值引用的作用让被引用的右值“重获新生”,其生命周期和右值引用类型变量的生命周期一样,不会被马上析构掉。struct A{ A() { cout << "construct: " &..
2020-05-31 22:56:19
923
原创 lambda表达式
语法形式:[ capture ] ( params ) opt -> ret { body; }注意:允许省略返回值类型,编译器会自动推导出返回类型。在没有参数列表时,可以省略参数列表即小括号[] 表示不捕获任何变量;[&] 捕获外部作用域所有变量,且作为引用在函数体中使用(按引用捕获)[=]捕获外部作用域所有变量,且作为副本使用(按值捕获)[=, &foo] 除了foo变量是按引用捕获,其它变量按值捕获[bar]按值捕获bar变量[this]捕获当前类
2020-05-28 21:53:49
103
原创 std::function与std::bind
std::function 可调用对象的包装器,它是一个类模板,可以容纳函数指针,仿函数或可被转换为函数指针的类对象使用方法:在类型中填入函数签名(即函数类型,包括返回值和参数类型)#include <iostream>#include <functional> // for std::functionvoid func(void){ std::cout << __FUNCTION__ << std::endl;}class F.
2020-05-27 23:21:32
141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人