- 博客(26)
- 收藏
- 关注
原创 多路转接模型:select,poll,epoll
多路转接IO概念描述转接IO,对大量描述符的IO状态进行监控,使得程序能够知道哪个描述符IO是就绪的,可以进行IO操作,直接让程序针对就绪的描述符进行IO操作,提高效率(多用于网络通信服务器)IO就绪状态:可读:套接字接收缓冲区中,数据大小高于低水位标记(默认1字节)可写:套接字发送缓冲区中,剩余空间大小大于低水位标记(默认1字节)select模型实现思路在内核中遍历所有监控的描述符,判断IO就绪状态操作流程int select(int nfds, fd_set *readfds, fd
2021-03-27 22:52:30
157
原创 HTTP、UDP以及TCP协议,以及三次握手和四次挥手
协议解析:HTTP,TCP,UDP,IP应用层HTTP协议:超文本传输协议,最早只用来传输HTML是一个应用层协议,是应用程序组织数据的格式。组织完毕传输数据时在传输层使用TCP协议HTTP服务器/客户端就是TCP服务器/客户端,只是在上层使用了HTTP组织以及解析数据HTTP协议是一个字符串明文协议,将数据组织成特定形式的字符串进行传输书:《图解HTTP协议》协议实现:协议即数据格式的约定,协议实现即查看协议如何组织数据格式1 首行:数据的第一行请求首行:分为三部分,包含三个要素,要
2021-03-27 22:50:48
298
原创 进程、线程间的通信以及线程安全
进程间通信进程的虚拟地址互相独立,没法使他们的虚拟内存有交集,所以在物理内存上开辟一块空间,让两个进程在相同的该块内存中实现交互不同的通信方式应对不同应用场景:管道、共享内存、消息队列、信号量管道:实现数据资源传输,本质:内核中的一块缓冲区,通信的本质是访问同一块缓冲区虚拟地址空间分为内核空间和用户空间,进程只能访问用户空间,访问内核空间只能通过操作系统提供的系统调用接口进行访问内核空间只有一块,所有进程共有管道既是进程在内核空间中开辟一块缓冲区,所有能够访问该块缓冲区的进程可以实现通信管道
2021-03-27 22:43:44
502
原创 Linux下进程和线程的概念和控制
进程描述:浅层:运行中的程序,程序运行的动态描述程序的二进制指令加载到内存中,需要有一个pcb来描述它,这个pcb在Linux下是一个struct task_struct结构体进程就是pcb,是操作系统对一个运行中程序的描述。通过这个描述实现对程序运行的调度操作系统要运行某个程序时,找到其对应的pcb,将其中保存的各种描述信息(上下文数据)加载到cpu寄存器中,完成程序的轮询调度其中的内容有:内存指针,程序计数器(上一次程序运行到的位置),上下文数据(上一次CPU寄存器上处理的数据),进程标识符P
2021-03-27 22:42:43
167
原创 C++语言级别提供的四种类型转换方式
1.const_cast:去掉常量属性的类型转换int main() { //const_cast:去掉常量属性的类型转换 const int a = 10; int* p1 = (int*)&a; int* p2 = const_cast<int*>(&a);//相当于一个模板,尖括号中是想转换成的类型 //两种方式产生的汇编指令完全相同 //但是传入的类型或指针类型与原类型不相符,const_cast会报错。而强转则没有限制 //int b = const_c
2021-02-20 11:55:52
184
原创 C++中的多重继承
多重继承:一个派生类有多个基类虚基类class A {public:protected: int ma;};class B :virtual public A {//虚继承,类A称为虚基类public:private: int mb;};通过命令提示输入cpp文件路径/cl cpp文件名.cpp/dlreportSingleClassB 来查看当前类B内存状况虚基类数据保存在了派生类的最末尾,类的起始部分生成一个vbptr,指向vbtable。vbtable第一行是vbptr向
2021-02-20 11:55:10
292
原创 如何解释C++中的多态
静态(编译时期)的多态:1.函数重载2.模板(函数模板、类模板)动态(运行时期)的多态:定义:在继承结构中,基类指针/引用指向派生类对象,再通过该指针调用同名覆盖方法(虚函数)。基类指针指向哪个派生类对象就会调用哪个派生类对象的同名覆盖方法,称为『多态』多态底层通过动态绑定实现。通过解引用访问到派生类对象,再通过对象中的vfptr访问它的vftable,再得到它的虚函数地址#include<iostream>#include<string>using namespa
2021-02-20 11:51:47
99
原创 C++中的虚函数
#include<iostream>using namespace std;class Base {public: Base(int data) :ma(data) {} void show() { cout << "Base::show()" << endl; } void show(int) { cout << "Base::show(int)" << endl; }protected: int ma;};
2021-02-20 11:49:12
101
原创 C++继承结构中的重载与隐藏
#include<iostream>using namespace std;class Base {public: Base(int data) :ma(data) {} void show() { cout << "Base::show()" << endl; } void show(int) { cout << "Base::show(int)" << endl; }protected: int ma;};
2021-02-20 11:46:37
116
原创 C++继承中派生类对象的构造、析构过程
#include<iostream>using namespace std;class Base {public: Base(int data) :ma(data) { cout << "Base()" << endl; } ~Base() { cout << "~Base()" << endl; }protected: int ma;};class Derive :public Base{public:
2021-02-20 11:45:03
557
原创 C++中继承的本质和原理
本质:代码的复用class A {public: int ma;protected: int mb;private: int mc;};class B :public A {//公有继承 A:父类/基类 B:子类/派生类public: int md;protected: int me;private: int mf;};其中A有12个字节(三个整型成员变量),B有自己的三个成员变量和从A继承而来的三个成员变量,故有24个字节从基类继承来成员时还附带了基类的作用域,因此可
2021-02-20 11:43:12
694
原创 C++中的简单allocator空间配置器实现
#include<iostream>using namespace std;template <typename T>class Vector {public: Vector<T>(int size = 10) { _first = new T[size]; _last = _first; _end = _first + size; } ~Vector<T>() { delete[]_first; _last = _end =
2021-02-19 16:50:57
164
原创 C++中的函数模板
模板的意义:对类型也可以进行参数化了template<typename T,typename E>//定义一个模板参数列表,typename也可以用class替换bool compare(T a,T b){//compare是一个函数模板 cout<<"template compare"<<endl; return a>b;}//特例化:template<>bool compare<const char*>(const cha
2021-02-19 16:47:30
91
原创 C++中的三种成员方法
普通的成员方法:1.属于类的作用域2.调用该方法时需要依赖一个对象(常对象无法调用)3.可以任意访问对象的私有成员静态成员方法:(不会生成this形参)1.属于类的作用域2.用类名作用域调用方法3.可以任意访问对象的私有成员,但是仅限于不依赖对象的成员(只能调用其他的静态成员)class CShop{public: CShop(const char *n, int a, double p,int y, int m, int d) :_amount(a)//int _amount =
2021-02-19 16:46:27
553
原创 C++中浅拷贝与深拷贝问题
class TestClass{}class SeqStack{public: SeqStack(int size = 10){ _pstack = new int[size]; _top = -1; _size = size; } ~SeqStack(){ delete []_pstack; _pstack = nullptr; }private: int *_pstack; int _top; int _size;}/*-----------------
2021-02-19 16:45:07
118
原创 C++中类和对象的基础概念
OOP语言四大特征:抽象,封装,继承,多态类:实体的抽象类型根据实体的属性和行为,得到它的ADT(abstract data type抽象数据类型)通过实例化为对象,属性→成员变量,行为→成员方法属性一般是私有的放在private,public则是给外部提供共有的方法来访问私有的属性类体内实现的方法,自动处理成inline内联函数要在类体外实现,需要在方法名前面加类的作用域void CShop::init(const char *name,double price,int amount){
2021-02-19 16:42:41
99
原创 C++中的new&delete
new和malloc、delete和free的区别1.malloc和free称作C的库函数,new和delete称作运算符2.new不仅能开辟内存,还能进行内存初始化;malloc只能开辟,需要另写代码初始化new int(30);new int[30];/*new一个数组时不支持给初值,但是可以*/new int[30]();//每一个值初始化为03.malloc开辟内存失败是通过比较返回值和nullptr;new则是通过抛出bad_alloc类型的异常来判断4.见a3.2,通过new生成的堆
2021-02-19 16:40:19
75
原创 C++中的引用
引用和指针的区别和共性:引用是一种更安全的指针判断引用的写法可以先写成指针,在把右边的&挪到左边覆盖*1.引用必须初始化,指针可以不初始化。2.定义一个引用变量和定义一个指针变量在汇编指令上是一模一样的,在指令上都是通过指针来进行的(定义时把需要被引用的地址存下来,赋值时先拿到引用的地址,再解引用),所以要求右边的值必须要可以被取地址(比如引用一个数是不行的)。通过引用变量修改引用内存的值,和通过指针解引用修改指针指向内存的值,底层指令也是一样的。3.引用只有一级引用,没有多级引用。sw
2021-02-19 16:39:31
113
原创 C++中const的一些知识点
C++和C语言const的区别const初步理解:修饰的值不能再作为左值。初始化完成后值不能被修改C语言中:void main(){ const int a;//可以不用初始化不会报错,但若如此做再也没有机会给他合法的值 const int b = 10; int array[b] = {};//这一句会报错,C语言中const修饰的量不是常量,应称为常变量,不能按照常量使用 int *p = (int *)&b; *p = 20;//可以运行,const修饰的变量只在语法上保证不能
2021-02-19 16:38:50
168
原创 函数重载
定义:1.一组函数,其中函数名相同,参数列表的类型和个数不同,这一组函数称为函数重载。Q:为什么C语言代码不支持函数重载?A:C++代码产生的函数符号是由函数名+参数列表类型构成的,C代码产生的符号只有函数名。2.一组函数想要构成重载必然要处在同一作用域当中bool compare(int a,int b){//compare_int_int return a>b;}bool compare(double a,double b){//compare_double_double ret
2021-02-19 16:37:43
197
原创 inline内联函数
int sum(int x,int y){ return x+y;}int main(){ int a; int b; int ret = sum(a,b); //此处有标准的函数调用过程:参数压栈,函数栈帧的开辟和回退过程 //所以有函数调用的开销j return 0;}在编译过程中没有函数的调用开销了,在函数的调用点直接把函数的代码展开进行处理inline int sum(int x,int y){ return x+y;}int main(){ int a; int
2021-02-19 16:36:16
101
原创 进程虚拟地址空间
进程虚拟地址空间char *p = "hello";*p = 'a';编译通过,运行报错,因为*p保存在.test代码段,只能读不能写const char *p = "hello".data 数据段存放初始化为非0的变量.bss 数据段存放初始化为0和未初始化的变量用户空间是不同进程独有的,内核空间是独享啊...
2020-09-21 21:30:30
64
原创 2020-08-28
C++继承中子类的构造和拷贝构造和运算符重载父类class Person{public: Person(const char* name = "peter") : _name(name) { cout << "Person()" << endl; } Person(const Person& p) : _name(p._name) { cout << "Person(const Person& p)" << e
2020-08-28 23:36:12
60
原创 2020-08-23
C语言中的内存管理代码区存放代码指令、常量,函数包括main函数,代码区在程序运行时不变存放全局const变量静态区存放全局变量和静态变量(所有static变量)栈先进后出,存自动变量和函数形参(C中入栈顺序从右到左)堆没有先进后出,帮助解决栈溢出char *p = (char *)malloc(1024 * 1024 * 1024);//在堆中申请了内存明确知道数据大小,数据量较小时用栈,大时用堆;不知道数据量大小用堆;需要动态创建数组用堆。...
2020-08-23 21:16:25
42
原创 代码生成阶段的主要任务是什么?
代码生成阶段的主要任务是什么?大体流程编译预处理:编译阶段:优化阶段:汇编过程:链接程序:大体流程源代码->预处理->编译->优化->汇编->链接->可执行文件编译预处理:读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理编译阶段:预编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。优化阶段:优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针
2020-06-13 23:29:16
1956
1
原创 C++一些入门知识
C++一些入门知识一、 名字空间(定义作用域)解决函数、全局变量名重复的问题,在两个名字里的重复函数实际是两个完全无关的函数。名字空间可以嵌套,内外部没有关系。名字空间允许重名,会被合并。使用using关键字,引用一个名字空间,时期中所有内容对自己可见。两个名字空间有名字相同的函数,同时用using引用两个不会报错,除非使用了这些函数,因为会产生歧义。二、 函数重载允许在 同一...
2019-09-01 22:22:05
60
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人