c++
xunshuidezhu
这个作者很懒,什么都没留下…
展开
-
SIGBUS SIGSEGV
SIGSEGV只读映射区写数据SIGBUS一些硬件内存对齐要求原创 2020-04-29 17:20:15 · 244 阅读 · 0 评论 -
static inline
## inlineinline仅仅是展开替换,不存在函数入口,如果放在.h中,会重复引用,所以配合static 使用原创 2020-04-29 16:57:12 · 197 阅读 · 0 评论 -
无锁队列
cas:bool compare_and_swap(int* ret, int oldval, int newval){ if (*ret == oldval) { *ret = newval; return true; } return false;}gcc cas:bool __sync_bool_compare_an...原创 2020-02-05 12:20:33 · 190 阅读 · 0 评论 -
gcc linux利用CAS实现无锁编程
利用__sync_bool_compare_and_swap(),实现无锁编程CAS即compare and swap,每次都会和old 值进行比较,如果没有发生更改再用new值给ptr赋值,然后返回true#include <bits/stdc++.h>#include <pthread.h>#include <stdlib.h>#includ...原创 2019-12-11 18:28:19 · 868 阅读 · 0 评论 -
gcc linux 利用原子操作实现无锁编程
_ATOMIC_ADD_和_ATOMIC_SUB_是我实现的两个宏,分别对应__sync_fetch_and_add(x, y) __sync_fetch_and_sub(x,y)x需要传地址,y为要加/减的数,可以替代多线程mutex编程#include <bits/stdc++.h>#include <pthread.h>#include &...原创 2019-12-11 16:37:15 · 339 阅读 · 0 评论 -
开源网络库owl分析(一)reactor模式分析
代码地址:https://github.com/xunshuidezhu/owlowl是本人开发的一个基于reactor架构的网络库,包含了reactor模型,日志库,协程库,http模块,计时器,采用epoll LT模式,配合协程的使用,可以轻松实现异步网络io,而不必采用非阻塞io+epoll的多线程并发模型.网络库的核心模型为reactor模式,主要有demultiplexer也就是...原创 2019-12-05 15:47:08 · 631 阅读 · 1 评论 -
生产者消费者与阻塞队列
队列以及锁和条件变量的封装,注意队列的阻塞在生产者消费者代码中实现,代码中的队列只负责任务的生产消费场所#include <bits/stdc++.h>#include <pthread.h>#include <unistd.h>using namespace std;struct Data { int data;};class...原创 2019-12-05 15:33:37 · 155 阅读 · 0 评论 -
c++ 装饰器设计模式
装饰器设计模式就是在原有类的基础上增加一些装饰功能,顶层的接口实现子类作为要实例化的对象,传到装饰器中,增加特定装饰器的功能,我习惯用代码解释,直接看代码.这段代码包含了两个例子,都是先定义一个顶层的接口,然后定义装饰器抽象类,里面维护了一个接口的指针,在具体的装饰器中,通过构造函数传递顶层接口的实现子类指针,借助多态机制实现装饰功能.#include <bits/stdc++.h...原创 2019-11-24 15:04:31 · 177 阅读 · 0 评论 -
c++ pimpl编程技法
之前写过一次关于pimpl的博文,最近写代码又频繁遇到这个,再次总结一次.先来看一段代码,这段代码中无论Impl中的print函数如何更改,客端调用Shape的print接口都不用更改,因此降低了接口的耦合性.屏蔽掉了接口的具体实现方式.另一个作用就是降低了头文件之间的依赖关系,大大降低编译时间#include <bits/stdc++.h>using namespace...原创 2019-11-24 14:57:28 · 190 阅读 · 0 评论 -
gdb调试 显示代码
1.gdbtuigdbtui -q 需要调试的程序名 【用gdb -tui可以进入】直接使用 GDB 调试代码,在需要的时候使用切换键Ctrl + X + A调出 GDB TUI 。2.layout1. 显示源代码窗口(gdb) layout src2. 显示寄存器窗口(gdb) layout regs3. 显示汇编代码窗口(gdb) layout ...原创 2019-11-17 16:32:24 · 1961 阅读 · 0 评论 -
位图bitmap数据结构详解与实现
当数据量很大而每个数据的状态又很少的情况时候,可以用位图来设计存储数据的容器。在地址空间中,栈是向下生长的,如果用int32_t来作为一个存储单元,则每32位可以看作一组,底层的数据结构可以连续的数组,则原本用32个字节才可以表示一个状态现在可以用一个字节表示一个状态。在数据插入位图的时候,用位或运算,在查找的时候,用位与运算。代码如下:#include <iostream...原创 2019-10-21 15:52:47 · 2214 阅读 · 0 评论 -
PIMPL模式: Pointer to Implementation
1PIMPL解释 PIMPL(Private Implementation 或 Pointer to Implementation)是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。2.分析//x.hclass X{public: void Fun();private: int i; //add int i;};//c.h...原创 2019-07-01 15:11:27 · 478 阅读 · 1 评论 -
线程资源分配与释放(转载)
很好的文章,提到内核线程与用户态线程以及资源的分配管理释放https://www.jianshu.com/p/ea692d4f5e27转载 2019-07-12 10:18:10 · 1613 阅读 · 0 评论 -
gcc __thread
__thread 变量__thread 标识符修饰的全局或静态变量是线程独立的,线程对该变量的操作对其它线程来说是不可见的。然而线程之间共享内存空间的,因此要达到如些效果就需要针对该变量为每个线程分配变量的存储位置。在 Glibc 中, 所有的 __thread 变量是与 pthread 关联存储的,通过相对于 pthread 变量地址的偏移实现对变量的寻址。即是说,pthread 变量的地址...原创 2019-07-12 10:21:57 · 778 阅读 · 0 评论 -
udp实现可靠传输
做项目正好需要用可靠传输UDP来做传输层,基本思路还是在应用层模仿TCP,超时重传,滑动窗口等机制,三次握手,四次挥手过于复杂,简化成了2次握手,仅确认SEQ或者ACK,如果没有收到正确的报文则重传报文。数据包在发送之前会先存到数据队列,实现缓存,每次发包从数据去取,超时重传时间,超时重传最大次数也要设置,以防止进程被阻塞。...原创 2019-07-23 22:00:48 · 282 阅读 · 0 评论 -
环形缓冲区
本来是leetcode 一道题,环形缓冲区也是一样的设计思路,记录一下class MyCircularQueue {private: vector<int> data; // 存放循环队列的数据 int head; // 循环队列头 int tail; // 循环队列尾 int len; // 循...原创 2019-09-01 19:33:00 · 187 阅读 · 0 评论 -
stl容器内部数据结构
1.vector 底层数据结构为数组 ,支持快速随机访问2.list 底层数据结构为双向链表,支持快速增删3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问...deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下...原创 2019-09-01 19:38:04 · 280 阅读 · 0 评论 -
operator++()与operator++(int)以及前置后置递增与左值右值的关系
如果需要重载++或者--,编译器怎么确定是前置还是后置,其实前置后置是不同的写法。先上结论,operator++()是前置也就是++i,operator++(int)是后置也就是i++。++i返回的是引用,前置递增、递减运算符返回的是左值,后置递增,递减返回的是右值。上代码:class A {public: int a;public: A& oper...原创 2019-09-06 16:27:18 · 1084 阅读 · 0 评论 -
gcc大全
1。gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译2。gcc的基本用法gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字3。为什么会出现undefined referen...原创 2019-10-05 18:30:57 · 616 阅读 · 0 评论 -
c++实现反射
https://blog.csdn.net/q1007729991/article/details/56012253转载 2019-10-07 16:15:56 · 178 阅读 · 0 评论 -
c和c++内存模型
C分为四个区:堆,栈,静态全局变量区,常量区C++内存分为5个区域(堆栈全常代 ): 堆 heap : 由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露” 栈 stack : 是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变...原创 2019-07-15 22:16:26 · 315 阅读 · 0 评论 -
c++内存对象模型
http://mp.blog.csdn.net/postedit转载 2019-07-15 22:13:13 · 126 阅读 · 0 评论 -
c++左值右值与移动构造函数
#include <iostream>#include <cstring>#include <cstdlib>#include <vector>using namespace std;int main(){ string st = "I love xing"; vector<string> vc ;...原创 2019-07-06 16:27:07 · 340 阅读 · 0 评论 -
模板全特化
特化其实就是特殊化的意思,在模板类里,所有的类型都是模板(template<class T>),而一旦我们将所有的模板类型T都明确化,并且写了一个类名与主模板类名相同的类,那么这个类就叫做全特化类。C++模板全特化之后已经失去了Template的属性了。#include <iostream>using namespace std;template <cl...原创 2019-06-26 12:23:10 · 406 阅读 · 0 评论 -
c++ new
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。以下代码:#include <iostream>using names...原创 2019-06-22 17:56:34 · 2484 阅读 · 0 评论 -
c++静态成员函数与静态数据成员
对象与对象之间的成员变量是相互独立的。要想共用数据,则需要使用静态成员和静态方法。 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变量。(因为静态成员变量在对象创建之前就已经被分配了内存空间) 静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)。静态...原创 2019-06-18 14:12:49 · 274 阅读 · 0 评论 -
c++静态成员函数的作用
静态成员函数主要为了调用方便,不需要生成对象就能调用。比如:class X{public: void MethodA(); static void MethodB();}此时MethodB可以直接调用,X::MethodB();MethodA必须先生成类对象才能调用,X x; x.MethodA();函数的行为对所有派生类都一致时,可以声明为静态。...原创 2019-06-18 14:08:22 · 11480 阅读 · 0 评论 -
c++重载重写与重定义
1 成员函数重载特征: a 相同的范围(在同一个类中) b 函数名字相同 c 参数不同 d virtual关键字可有可无e 不可按返回值类型判断是否重载:无法以返回值类型作为重载函数的区分标准。class base {public: void foo() {}; int foo() {};};编译器会报错,因为foo的参数相同只有返回...原创 2019-07-01 15:41:34 · 127 阅读 · 0 评论 -
c++ 前向声明
一、使用场景 假设有两个类A和B,类A要将类B的对象(或者指针)作为自己的成员使用,并且类B将类A的对象(或者指针)作为自己可以访问的数据,那么这个时候要在a.h中include b.h,同时在b.h 中要include a.h,但是相互包含是不可以的,这个时候就要用到类的前向声明了。 类的前向声明是利用了编译器的特性,编译器在编译的过程中只需要知道各个元素的名称和相应的大小就...原创 2019-06-11 20:40:43 · 487 阅读 · 0 评论 -
c++ assert
对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性。简单地讲,断言就是对某种假设条件进行检查。在 C 语言中,断言被定义为宏的形式(assert(expression)),而不是函数,其原型定义在<assert.h>文件中。其中,assert 将通过检查表达式 expression 的值来决定是否需要终止执行程序。也就是说,如果表达式 expression 的值为假(即为 0...原创 2019-06-10 19:31:04 · 381 阅读 · 0 评论 -
c++内存机制
c++的内存机制在不同的编译器下是不一样的。类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的。成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这...原创 2019-06-10 19:22:13 · 122 阅读 · 0 评论 -
c++ 防止类被派生,不用final如何实现
c++中没有提供类似Java的final classes那样的禁止派生的机制(c++11有final,防止类被继承)为了避免产生虚函数表,如果类不是基类的话,析构函数就不需要声明为虚函数。 但是,我们不能预料用户的行为,你不敢肯定用户是否会从你的类去派生自己的类。如果用户以一个基类指针去删除一个派生类的对象,就会发生派生类的析构函数不被调用的情况。这样做的危险性我想大家都知道。当然,...原创 2019-06-13 19:58:13 · 373 阅读 · 1 评论 -
c++深拷贝和浅拷贝
例子:老师给你们留了作业,你们班只有小A一个人会写,其他人都需要copy他的作业。如果你们都是通过浅拷贝来完成作业,那么就相当与“在你需要的时候,小A会把作业借给你”。例 如,老师对小B说“去把你的作业拿来给我看看”,小B赶快找小A借作业给老师看。老师又要看小C的作业,小C也只能找小A借过来应付老师。总之老师如果一 个一个的检查作业,你们都能应付,因为你们只有一本作业互相借着...原创 2019-06-26 14:49:40 · 122 阅读 · 0 评论 -
c/c++ #头文件路径寻找 -I指令与系统默认路径/usr/include,/usr/local/include...
C/c++中可以通过#include <stdio.h>和#include "stdio.h",区别是:#include <stdio.h>,直接到系统指定目录去查找头文件。#include "stidio.h",会先到当前目录查找头文件,如果没找到在到系统指定目录查找。gcc编译时查找头文件,按照以下路径顺序查找:1. gcc编译时,可以设置-I选项以指定...原创 2019-07-09 10:54:14 · 9014 阅读 · 0 评论 -
线程同步,互斥量与条件变量,两个线程交叉打印数据
多线程同步一直是一个难点,利用linux的互斥锁与条件变量实现了两个线程交叉打印数据,并且进行初步封装,可重用/************************************************** * 两个线程交叉打印 * ************************************************/#include <pthread.h...原创 2019-07-11 15:34:12 · 310 阅读 · 0 评论 -
嵌套类,局部类
嵌套类所谓嵌套类就是可以在一个类中定义另一个类。这个被嵌套的类的作用域就只在它的上一级类中。下面是个例子:#include <iostream>using namespace std;class c1{public: int a; void foo(); class c2 { public: int a; ...原创 2019-07-01 11:31:45 · 175 阅读 · 0 评论 -
mutable
常函数就是带const修饰的函数,为什么要有常函数这个概念,因为为了封装的良好性,优势我们用到的一些函数并不需要我们去改变类中的参数,和成员变量,仅仅只是为了显示和输出的作用,因此才引进常函数,multable的英文意思主要是可变的,我们了解到c++中,一件事情并不是绝对的,如果有常函数,那么一定有可以修改的方法,这里就用到了这个关键字。。看一下下面的代码下面是一个小例子:class...原创 2019-07-15 15:44:17 · 114 阅读 · 0 评论 -
trivial,non-trival, pod
Trivial(平凡)和Non-Trivial(不平凡)是对于class(类)的或者类中的四个函数而言的: 1.构造函数 2.拷贝构造函数 3.赋值函数 4.析构函数Trivial其中Trivial(平凡)的概念本人的理解是无意义的,Trivial是相对于Non-Trivial而言的。Non-Trivial对于Non-Trivial而言的,如果上面四种函数满...原创 2019-07-15 14:08:22 · 1125 阅读 · 0 评论 -
动态内存,智能指针
由编译器自动分配的内存都有着严格的生存期。全局对象在程序启动时分配,在程序结束时销毁。对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部static对象在第一次使用前分配,在程序结束时销毁。除了自动和static对象外,C++还支持动态分配对象。动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会销毁。静态内存用来保存局部sta...原创 2019-06-30 14:04:04 · 105 阅读 · 0 评论 -
事件驱动与异步io
https://blog.csdn.net/qq_34173549/article/details/80212101原创 2019-07-09 16:32:01 · 131 阅读 · 0 评论