- 博客(18)
- 收藏
- 关注
原创 两种高效的并发模式(半同步/半异步模式 领导者/追随者模式)
半同步/半异步模式:首先要区别于I/O模型中的同步异步:I/O模型中: 同步和异步是指内核向应用程序通知的是何种I/O事件(就绪事件/完成事件),以及该由谁来完成I/O读写(应用程序/内核);I/O模型中的同步和异步是用来形容I/O事件的完成。半同步与半异步模式中: 同步主要是指程序完全按照代码序列的顺序执行;异步是指程序的执行需要由系统事件来驱动(常见的系统事件:中断,信号...
2019-07-31 11:32:09 541
原创 两种高效的事件处理模式 Reactor Proactor
Reactor模式:主线程(IO处理单元)只负责监听文件描述符上是否有时间发生,有的话立刻将事件通知给工作线程(逻辑单元)。除此之外,主线程不做其他任何工作,读写数据,接受新的连接即处理客户请求均在工作线程中完成。使用同步IO模型epoll_wait实现的Reactor模式的工作流程如下:1. 主线程往epoll内核事件表中注册socket上的读就绪事件。2. 主线程调用epoll...
2019-07-27 19:02:20 181
原创 智能指针(一)
智能指针提出的原因及解决办法:在C++中主要使用new和delete来分配和释放内存,内存的释放是由程序员来操作,但由于我们常常忘记释放内存导致内存泄漏问题。于是在C++11中提出了智能指针的概念,以便于管理内存。通常在new一个新的对象时会在堆上申请一块内存,在进行复制或赋值操作时会导致多个指针指向同一块内存,如果其中一个指针进行操作,如果删除该指针指向的对象,会导致其他指针指向的对象也...
2019-07-24 11:29:04 176
原创 STL容器之vector容器
vectorvector的本质其实是一个动态数组,它是在堆中分配内存,元素连续存放,有保留内存。优点:自动管理内存,拥有一段来连续的内存空间,并且起使位置不变。动态改变长度并随着元素的增大而则增大,减少大小,内存不会随之释放。(在扩大内存时。先扩大当前内存容量的两倍,如果还是不够,就扩大至足够大的容量)缺点:因为内存空间是来连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该...
2019-07-20 21:01:05 236
原创 STL之set容器与multiset的应用
set容器容器中包含的元素是唯一的,而且是有序的,在插入时,不能指定位置插入,按照顺序插入(因为set容器的本质是一颗红黑二叉树,所有节点都是有序的。查寻数据的效率比vector快)。set提供了insert和erase函数,用来对元素进行插入和删除操作。默认的数据存储顺序是从小到大int main(){ //普通数据类型的排序 //默认,从小到大 set<int&...
2019-07-17 14:13:51 89
原创 C++函数模板
函数模板模板是指将类型参数化,而模板的处理一般在编译阶段完成template<class形参名,class形参名,......>返回类型 函数名(参数列表){函数体}template<typename T>T Sum(T a,T b) //设计了一个函数模板{ return a+b;} int main(){ Sum<int&g...
2019-01-15 01:32:12 112
原创 C++中类和对象调用及生成
1.C++有三大特征:封装,继承,多态封装:就是把普通的对象进行封装,对象的属性设为私有的,对外提供get和set方法,其他类只能通过get和set对对象属性值进行操作。其中封装的三个访问限定符:1.public:任意位置访问; 2.protected: 本类,子类中访问; ...
2019-01-15 00:43:37 897
原创 写时拷贝技术
写时拷贝故名思意:是在写的时候(即改变字符串的时候)才会真正的开辟空间拷贝(深拷贝),如果只是对数据的读时,只会对数据进行浅拷贝写时拷贝技术原理: 写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的...
2019-01-14 22:56:54 145
原创 fork()函数的调用原理
fork函数用于创建子进程,典型的调用一次,返回两次的函数,其中返回子进程的PID和0,其中调用进程返回了子进程的PID,而子进程则返回了0,这是一个比较有意思的函数,但是两个进程的执行顺序是不定的。fork()函数调用完成以后父进程的虚拟存储空间被拷贝给了子进程的虚拟存储空间,因此也就实现了共享文件等操作。但是虚拟的存储空间映射到物理存储空间的过程中采用了写时拷贝技术(具体的操作大...
2019-01-14 22:38:07 754
原创 C++编译之预编译 编译 汇编 链接 四个阶段
我们所写源文件变成可执行程序是需要经过一系列的过程的,也就是我们所说的编译链接,下面简单介绍编译链接原理编译链接的几个步骤如下图所示:1.预编译阶段主要工作为:(1)#include 递归展开头文件(2)#define 宏定义替换(3)删除注释(4)添加行符号文件标识(5)保留#pragma(交给编译器处理).c/.cpp文件经过预编译处理生成.i文件...
2018-12-04 19:33:27 1264
原创 Linux下4G虚拟地址空间的分布
我们现在所写的源代码并不是我们所说的程序,从C代码(.c/.cpp)---->链接程序(.exe)是要经过以下几个过程才能真正的运行链接的;C源程序--->预编译处理(.c/.cpp)-->编译,优化程序(.s)--->汇编程序(.o)--->链接(.exe)在编译运行过程中,我们首先需要将我们的程序存储到内存中才能调取运行,但是内存是有限的,不可能将所有的进...
2018-11-13 12:01:46 642
原创 内存对齐(常用)
规则:1.结构体内成员按自身长度对齐。自对齐:即该成员的起始位置的内存地址必须是自身长度(不同数据类型占不同的字节数)的整数倍。2.结构体的总大小为结构体的有效对齐值的整数倍。举例如下:例1:struct C{ char a;//1+1 short b;//2 int c;//4};//8例2.需要考虑数组的内存...
2018-05-06 19:13:54 142
原创 字符串崩溃的原因
1.试图修改字符串常量的值2.越界 int main() { char *str1="abcdef"; //字符串常量 ,不可以随意改变 char str2[]="abcdef"; //字符数组,结尾为‘\0’,所以也是字符串 }char *str1 ="abcdef"中*str1存放的是字符串的首地址,指向字符串char *str2[]="abcdef"是自己定义的,可...
2018-05-02 16:26:06 458
原创 两种求斐波那契数列方法
1.用循环求:#include<stdio.h>int Fabio(int n){ int fab1=1; int fab2=1; int fab3=1; for(int i=2;i<n;i++) { fab3=fab1+fab2; fab1=fab2; fab2=fab3; } return fab3;}int main(){ ...
2018-04-20 00:40:41 197
原创 const用法
用const 定义常变量而const定义的这个变量为只读变量,在程序中不可再次赋值,更改。contst可以定义在 ____类型____*_____变量 横线某一处;使用规则:a:数据类型对于const相当于透明。(例:const int a==int const a)b:const用于封锁直接修饰的内容,将该内容变为只读。 例: int ...
2018-04-17 23:56:48 127
原创 交换函数
如果要实现两个变量之间的交换,通常除了要交换的两个变量以外再多定义一个变量,用来传递变量,在传递字符串时。需调用库函数#include<string.h>代码示例为:#include<stdio.h>int main(){ int a=10; int b=20; int c; c=a; a=b; b=c; printf("%d\n %...
2018-04-08 21:39:50 171
原创 指针的定义
我们每个变量的所应用的每个变量的存放都有其相对应的地址,而为了方便根据地址查找这些变量,我们用指针存放变量的地址,通过指针查找变量;我们将地址形象化的称为“指针”。“指针”=“地址”#include<stdio.h>int main(){ int a=10; int b=20; int *p=&a; //定义时*说明p是个指针类型的变量,存放a...
2018-04-08 20:34:06 88
原创 给出一个整数,求出它是几位数,分别输出每一位数字,按逆序输出各位数字.
给出一个整数,求出它是几位数:#include<stdio.h>int GetFigures(int n) { int count=0; do{ n/=10; count++; }while(n!=0); return count;}int main(){printf("%d\n",GetFigures(48274));return 0;}给出一...
2018-03-30 22:40:51 7069
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人