自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 同步 --异步 --- 阻塞--- 非阻塞 ---半同步/半异步 --- 半同步/半反应堆

《一》同步和异步I/O同步和I/O异步关注的是消息通知机制I/O同步:是有消息处理者自己去等待消息是否被触发,(同步需要主动读写数据,在读写数据的时候还是会阻塞,要等待这两个操作成功才能返回)I/O异步:当所关注的消息被触发是,由消息触发机制通知触发对消息的处理、是由触发机制通知消息处理者,类似于select、poll(异步只需要I/O操作完成消息通知,并不主动读取数据,由操作系统内核...

2018-08-29 17:25:25 591

原创 内联函数和宏的区别

1、替换的时机内联函数是在编译期间进行替换,就是将该函数在函数的调用点直接展开宏函数是在预处理阶段替换2、替换的成功率内联函数只是对编译器的一个建议,如果编译器觉得该函数不适合成为内联函数时,便会忽略前面的[ inline ]关键字,比如我们将递归函数写成内联函数,编译器会忽略前面的[ inline ]关键字(不会再调用点展开),把它当做一个普通的递归函数处理,宏一旦定义则在预...

2018-08-23 14:02:24 319

原创 c++几个关键字-----Explicit、Mutable、volatile

Explicit关键字:阻止隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。class String{public: expli...

2018-08-21 16:09:14 247

原创 堆和栈的区别

1、空间分配:堆:手动申请、手动释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表 栈:系统开辟,系统释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、申请后系统的响应只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢     出。     首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请...

2018-08-21 13:17:42 207

原创 c++同名函数----重载、隐藏、覆盖

 《一》重载重载的规则:函数名称必须相同。 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。 函数的返回类型可以相同也可以不相同。 仅仅返回类型不同不足以成为函数的重载。 相同的范围(在同一个类中); virtual 关键字可有可无。为什么需要函数重载?试想如果没有函数重载机制,如在C中,你必须要这样去做:为这个print函数取不同的名字,如print_in...

2018-08-21 12:55:34 7243 4

原创 STL容器

容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。容器分类:一、顺序容器vector:向量容器,底层由数组实现,只有push_back()方法相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它

2018-08-20 18:15:05 238

原创 迭代器

《一》迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。迭代器的分类:1.输入迭代器(input iterator)功能取出其所指向的值   访问下一个元素 判断是否到达了最后一个元素 可以复制因此其支持的操作符有  *p,++p,p++,p!=q,p == q...

2018-08-20 17:36:03 197

原创 单例模式

单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。单例模式的优点:一、实例控制:单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所...

2018-08-20 15:28:56 122

原创 深拷贝和浅拷贝

对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部 数据。有两种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是...

2018-08-20 14:08:42 281

原创 c++的类型转换

c++中引入新的类型转换的原因:这是因为新的类型转换控制符可以很好的控制类型转换的过程,允许控制各种类型不同的转换.还有一点好处是C++的类型转换控制符能告诉程序员或读者我们这个转换的目的是什么,我们只要看一下代码的类型转换控制符,就能明白我们想要达到什么样的目的.ANSI-C++ 标准定义了4种新的类型转换操作符: reinterpret_cast, static_cast, dynamic...

2018-08-20 10:42:38 116

原创 c++设计模式-----工厂模式

《一》简单工厂模式简单工厂模式是属于创建型模式,又叫做静态工厂方法(static Factory Method)模式,简单工厂模式是由一个工厂对象决定创建出来哪一种产品类的实例.简单工厂模式的实质:是由一个工厂类根据传入的参数,动态决定应该创建哪一类产品类(这些产品类继承自一个父类或接口)的实例。打个比方假设有一个工厂,他能生产出A、B两种产品。当客户需要产品的时候一定要告诉共产是哪种产品...

2018-08-10 16:00:05 139

原创 c++继承

《一》单继承:派生类的直接基类只有一个<1>继承的方式class Base /*------------->基类/ 父类 */ { public: int ma;};class Derive:public Base /* ------------>派...

2018-08-08 15:27:30 113

原创 一个程序在执行main函数之前都干了些什么?

《一 》怎么执行程序(如何把程序加载到内存上首先内存需要的是数据和指令(机器语言)但是程序是高级语言,1:先通过编译链接生成.exe文件(.exe文件在磁盘中存储,且.exe文件中是机器语言)2:.exe文件通过mmap函数映射到虚拟内存上3:再通过分段分页机制把需要的指令和数据加载到内存 4:把main函数的入口地址写入到下一行指令寄存器中《二》编译链接的过程...

2018-08-08 09:27:39 9779 1

原创 gdb调试

debug 版本: 可调式版本release 版本: 发行版本 gcc 默认生成 release 版本gcc -o main main.c -ggcc -c main.c -g ---> debug 版本的中间文件gcc -o main main.o ---> debug 版本的可执行文件调试的目标: 可执行文件调试的手段: 通过源文件来控制程序的执行l 显示...

2018-08-06 18:34:57 120

原创 memcopy函数和memmove函数

memcpy:指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。函数原型:void *memcpy(void *dest, const void *src, size_t n);memmove:memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,mem...

2018-08-06 17:35:34 989

原创 进程和线程的区别

《一》概念进程:进程是资源分配的最小单位,进程是运行中的程序  系统通过进程控制块(PCB)来管理进程,操作系统通过双向循环链表来管理所有的PCB变量线程:线程是进程内部的一条执行序列, 一个进程至少有一个线程: 主函数的执行序列, 将其称之为主线程。 可以通过线程库创建其他的线程, 创建的线程称之为函数线程。线程是 CPU 调度的最小单位。线程依赖于进程而存在: 如果进程结束, 进程内部...

2018-08-06 15:44:24 128

原创 排序算法

排序算法大体可分为两种:一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。...

2018-08-06 14:33:55 138

原创 c++中的临时量和对象的生存周期

《一》临时量的生成:1.内置临时量:相当于一个常量  在存储器中存放2.自定义类型:相当于产生一个变量临时量  在内存中存放3.隐式生成临时量:相当于一个常量(const类型)不能用普通的引用来引用。例如赋值运算符重载函数的形参4:显示生成临时对象:相当于生成了一个变量,可以用普通的引用来引用《二》返回值1、其他类型:<=4字节  由eax寄存器带回       ...

2018-08-01 15:17:53 424

原创 c++中的四个函数-----构造,析构,拷贝构造,赋值运算符重载

《一》构造函数(初始化一个对象不是申请空间)可以重载(因为生而不同) 有this指针 对象不可以自己调用           原因:构造函数依赖对象调用所以只有对象生成了才能调用构造函数,但是生成对象需要调用构造函数(这就是一个先有鸡还是先有蛋的问题)(递归生成对象)《二》析构函数(释放所占的资源不是释放空间)1:不可以重载(死相同)2:有this指针3:可以自己调用,但...

2018-08-01 14:45:56 252

原创 malloc和new的区别

malloc是从堆上开辟空间,而new是从自由存储区开辟;(自由存储区是 C++抽象出来的概念,不仅可以是堆,还可以是静态存储区); malloc/free是函数,而new/delete是关键字 malloc对开辟的空间大小需要严格指定,而new只需要对象名 malloc开辟的空间即可以给单个对象用也可以给数组用,释放的方式都是free();而new开辟对象数组用...

2018-08-01 14:30:47 1392

原创 static关键字

《一》在c语言中static的作用:static修饰的变量和函数都只在本文件中访问,其他文件不可访问,用extern关键字也不可以 static修饰局部变量:     (2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;     (3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;     (4)它延长了局部变量的生...

2018-08-01 13:59:51 98

原创 TCP协议-----《第二篇》重传机制

我们都知道TCP的可靠传输是确认号来实现的,那么TCP的确认机制是怎样的呢?是收到一个包就马上确认,还是可以稍等一下在确认呢?所以我们就要先说一下TCP的延迟确认机制:按照TCP协议,确认机制是累积的,也就是确认号X的确认指示的是所有X之前但不包括X的数据已经收到了。确认号(ACK)本身就是不含数据的分段,因此大量的确认号消耗了大量的带宽,虽然大多数情况下,ACK还是可以和数据一起捎带传输的,...

2018-07-30 20:03:59 871

原创 TCP协议-----《第一篇》

 首先,我们需要知道TCP在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——Data Link层,在第二层上的数据,我们叫Frame,在第三层上的数据叫Packet,第四层的数据叫Segment。首先,我们需要知道,我们程序的数据首先会打到TCP的Segment中,然后TCP的Segment会打到IP的Packet中,然后再打到以太网E...

2018-07-30 18:59:44 236

原创 进程间的通讯-----------信号量

《一》概念:访问临界资源的一个计数器。            当信号量的值 > 0代表临界资源的剩余个数。            当信号量的值 < 0, 代表等待使用临界资源的进程个数            临界资源: 同一时刻只允许一个进程使用的资源。            临界区: 访问临界资源的代码区域            原子操作: 不可再分的, 不可被打...

2018-07-26 10:29:27 130

原创 进程间的通讯---------消息队列

《一》概念:消息队列是消息的链接表,存放在内核中,一个消息队列由一个标识符(队列ID)来标识《二》特点:消息队列是面向记录的,其中消息具有特定的格式以及特定的优先级,消息队列独立于发送与接收的进程,进程终止时消息队列及其内容并不会被删除。消息队列可以实现消息的随机查询,消息不一定一先进先出的次序读取,也可以按消息的类型读取(同类型的消息是按先进先出的次序读取)《三》消息队列的操作:创建...

2018-07-26 10:20:38 383

原创 进程间的通讯---------共享内存

《一》共享内存的实现原理:共享内存区域是多个进程共享的一部分物理内存,如果多个进程都把该内存区域映射到自己的虚拟内存地址空间,则这些进程就都可以直接访问这篇共享内存区域,从而可以通过该区域进行进程间的通讯 ,一个进程向共享内存中写入了数据,共享这个内存区域的所有进程都可以立刻获取到其中的数据,这块共享虚拟内存的页面出现在每一个共享该页面的进程的页表中,但是它不需要再所有进程的虚拟内存中都有相同...

2018-07-26 10:12:06 227

原创 进程间的通讯---------信号

信号是一种进程间消息通知机制,传递指定能够的信号值,接收信号的进程需要提前注册信号的相应方式(默认 忽略  自定义)《一》发送信号:int kill(pid_t pid ,int sigtype); Pid:指定信号发送的对象 Sigtype:信号类型 发送的是哪个信号《二》修改信号的响应方式:sa_handle signal(int sigtype, sa_handle ...

2018-07-26 10:04:32 162

原创 linux I/O复用-------select

select系统调用的用途是:在一段时间内,监听当用户感兴趣的文件描述符上的可读,可写,可异常等事件。《一》select系统调用原型:Int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* time out);成功将返回就绪文件描述符的个数,失败返回-1nfds:监...

2018-07-24 09:49:14 113

原创 linux I/O复用---------poll

poll系统调用和select类似,也是在指定的事件内轮询一定数量的文件描述符,以测试其中是否有就绪的文件描述符,不过poll聪明的地方就是它把事件和文件描述符绑定了起来(后面大家就会知道这个操作的优点了!!!!!!)《一》poll的函数原型如下:#include<poll.h>Int poll(struct pollfd*  fds,nfds_t  nfds,int  t...

2018-07-24 09:21:04 129

原创 linux I/O复用--------epoll

epoll是linux特有的I/O复用函数。它在实现和使用上与select,poll有很大的差异。首先,epoll使用一组函数来完成任务,而不只是单个函数,其次,epoll把用户关心的文件描述符上的事件都放在内核里的一个时间表中,而无需像select和epoll那样每次调用都要重复传入文件描述符集或事件集,但epoll需要使用一个额外的文件描述符来唯一标识内核中的这个时间表,这个文件描述符使用如下...

2018-07-23 17:21:05 128

原创 进程间的通讯-----管道

进程间的通讯:两个以上的进程相互传递数据管道就是进程通讯方式的一种。管道分为有名管道和无名管道管道:在进程之间建立数据传输的桥梁, 已完成数据的流通。注意: 管道是一种半双工通讯<一>有名管道概念:有名管道在磁盘上会占据一个 inode 节点, 但是不开辟 block。 有名管道会有一个文件名。有名管道的操作:创建有名管道文件:               1、 m...

2018-07-23 14:02:02 190

原创 fork()详解

<一>: fork()函数用来创建新的进程,它的特点是调用一次返回两次( 在原来的进程中返回新进程的 PID(新进程的 PID 肯定不等于 0), 在新进程中返回为 0.)函数原型:pid_t fork(void);pid_t getpid(); 获取当前进程的 pid 值。pid_t getppid(); 获取当前进程的父进程 pid 值。    图一如图一所...

2018-07-22 23:56:34 14959

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除