自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何不使用临时量交换两个数据?

1、可以采用异或的方式,如果相同位同号则为0,不同则为1#include <stdio.h>int main(){ int a=3,b=4; a=a^b; b=b^a; a=a^b; printf("%d %d",a,b);}可以得出结果a=4,b=3;2、可以利用加减法来实现#include <stdio.h&gt...

2019-09-22 20:51:59 146

原创 内存池的设计及思想?

1、内存池是什么?内存池是一组资源的集合。程序在申请堆上的内存时,我们可以给它一大块内存(远超出程序要申请的大小,即内存池),并且自己管理,而不是它要多少就从切换到内核态,给它多少。应用程序可以通过调用系统的内存分配函数预先一次性申请适当大小的内存作为一个内存池,并为这个内存池类或结构体定义一些分配和释放内存块的成员函数。之后应用程序自己对内存的分配和释放则可以通过这个内存池类及其成员...

2019-09-12 14:42:40 223

原创 类中的几个默认函数及其特点

1、构造函数特点:初始化对象所占的空间,可以重载,不依赖对象调用2、析构函数特点:释放对象所占的内存资源,不可以重载,依赖对象调用3、拷贝构造函数拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程 在c++中,下面三种对象需要调用拷贝构造函数(1)...

2019-09-12 09:04:10 247

原创 浅拷贝、深拷贝和写时拷贝

浅拷贝:指对象在复制时,只对对象的数据成员进行简单地赋值,而不复制对象本身,新旧对象还是共享同一块内存即只是增加了一个指针指向已存在的内存地址。因为共享同一份资源,当一个对象将这份资源释放掉,而此时另一个对象并不知道该资源已经被释放,当再次进行资源释放时,就会发生崩溃。深拷贝:是增加了一个指针并且申请了一个新的内存,这个新增加的指针指向新的内存,新对象和旧对象不共享内存,修改新对象不会影响到旧...

2019-09-12 09:02:08 168

原创 面向对象思想及封装,继承,多态

面向对象思想最重要的有五点,类,对象,还有面向对象的三大特征:继承,多态类是具备某些共同特征实体的集合,是一种抽象的数据类型,是对具有相同特征实体的集合,包括事物的状态信息(成员变量)和行为信息(成员方法),用成员变量描述人的基本属性比如:身高,年龄,姓名等等,用成员方法描述人的行为特征:比如吃饭,睡觉等等。对象就是真实世界的实体,实体与对象一一对应,也就是现实世界中的每一个实体都有一...

2019-08-20 15:33:00 244

原创 inline函数的特点,与宏,普通函数,static修饰的函数的区别?

inline函数发生在编译阶段inline函数的注意事项:1)inline一般写在头文件中2)inline只在release版本生效3)inline只是给编译器的一个建议(递归,循环,switch会被处理成inline)4)inline是基于实现的,不是基于声明的inline缺点代码膨胀为代价 空间换时间1)开展的开销>执行的开销 设为inline...

2019-08-19 11:05:10 264

原创 函数重载(重定义),C++函数符号的生成规则?

函数重载就是用一个函数名定义不同的函数,当函数名和不同的参数搭配是函数的含义不同.重载的三要素:1、同名2、不同参3、同作用域比如:using namespace std;int Sum(int a,int b) //Sum@@YAHHH@Z{return a+b;}double Sum(double x,double y) //Sum@@YANNN@Z...

2019-08-18 17:22:17 386

原创 指针和引用的区别?

指针是一个变量,存储的的是一个地址,指向内存的一个存储单元引用就是变量的一个别名而已,跟原来的变量实质上是一个东西。比如:int *p;int a=10;p=&a;则表示定义了一个整型变量a和一个指针变量p,该指针变量指向a的存储的单元,也就是p的值是a地址。int a=10;int &b=a;这两个代码表示定义了一个整型变量a和一个整型变量引用...

2019-08-18 17:18:58 91

原创 浏览器输入网址后发生的事情

前段时间面试时被问到如果在浏览器上输入网址回车后都进行了哪些操作,当时并没有很好的回答出来,因此私下就查看了一些资料,发现主要做了以下这些事情:第一步就是对网址进行DNS解析。DNS解析的过程就是寻找在哪台主机上有你需要的资源的过程,我们通常使用机器的域名来访问这台机器,而不是直接使用其IP地址,而将机器的域名转换为IP地址就需要域名查询服务,这个过程称为DNS解析,它主要充当一个翻译的角...

2019-08-14 20:27:55 548

原创 HTTP和HTTPS的区别?

http是指超文本传输协议https是指安全的超文本传输协议,它是在http协议的基础上加入了ssl协议保证安全传输。这三个协议它都属于应用层协议http和https主要应用于web浏览器和网站服务器之间传递数据,,http协议以明文的方式发送内容不提供任何方式的数据加密,因此如果攻击者截取了web浏览器和网站服务器之间的传输报文,就可以直接读到,安全性极差,所以它不适合传输一些敏感信...

2019-07-30 16:28:25 127

原创 C/C++关系

在c++程序中调用被c编译后的函数,为什么要加exten “c”主要是因为c++语言支持函数重载,而c语言不支持函数重载,函数被c++编译后在库中的名字与c语言不同。我们假设一个函数的原型为 void Sum(int a,int b),该函数在c编译器编译后在库中的名字为_Sum,而c++编译器则会产生像_foo_int_int之类的名字c++提供了c连接交换指定符exten “c”...

2019-07-30 16:11:51 324

原创 TCP/IP协议族体系结构以及主要协议

TCP/IP协议族是一个四层协议系统,从下到上分别是:数据链路层、网络层、传输层以及应用层各层协议如下:数据链路层:ARP(地址解析协议),RARP(逆地址解析协议);网络层:ICMP(因特网控制报文协议),IP(因特网协议);传输层:TCP(传输控制协议),UDP(用户数据报协议);应用层:ping,telent,OSPF,DNS;各层功能:数据链路层是用来实现网卡接...

2019-07-26 19:24:23 668

原创 位运算

C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移,相当与*2 >> 右移,正数高位补0,负数由计算机决定按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1...

2019-07-23 16:16:43 247

原创 栈和堆的区别

1、空间分配堆:由程序员自己分配和释放(malloc/free、new/delete),若程序员不释放,程序结束时可能由操作系统回收栈:由系统分配和释放,存放函数的参数值,局部变量等2、系统响应不同堆:遍历空闲地址链表,找到符合要求就删除该地址分配给程序,内存的首地址记录分配的大小,多余的内存回收栈:只要剩余空间大于申请内存,系统就会退出,否则会栈溢出。3、申请大小的限制...

2019-07-23 15:47:19 81

原创 结构体的的大小

计算结构体大小最重要的就是内存对齐我们先看一个简单的#include<iostream>using namespace std;struct A{ char a; //1 short b; //2 int c; //4};在这个结构体中,char的a 占1个字节,short类型的b占2个字节,int 类型的c占4个字节对齐前: ...

2019-07-23 14:50:40 360

原创 指针数组和数组指针

指针数组:定义:int *p[n][]优先级高先与p结合成数组, 再由int *说明这是一个指针数组,它有n个指针类型的数组元素“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含5个指向int 类型数据的指针,即指针数组。数组指针:定义:int (*p)...

2019-07-19 10:13:08 96

原创 虚拟地址空间布局

在多任务系统中,每个进程都运行在自己的虚拟地址空间上,32为模式下它是一个4G的内存地址块,在Linux系统下主要分为1G内核空间和3G用户空间,而在Windows系统下,内核空间和用户空间的划分比例为2:2.在Linux系统下虚拟地址空间布局如下图所示:位于虚拟地址空间最低部分为保留区,未赋予物理地址.text 为代码段用来存放程序执行代码.data段称为数据段,用来存放程序...

2019-07-17 20:18:23 454

原创 编译链接运行原理

一个程序能够成功运行主要有四个步骤:1.预编译 2.编译 3.汇编 4.链接1.预编译对c程序而言,它的预编译扩展名为.i,对c++程序而言,预编译之后的扩展名则为.ii预编译主要是处理源代码中以“#”开头的预编译指令,主要包括下面几方面:(1)将所有的#define删除,并展开宏定义;(2)处理所有的条件预编译指令,比如#if,#endif等;(3)递归展开#includ...

2019-07-17 19:24:27 133

原创 epoll源码剖析

epoll_creat(),创建内核事件表,底层实现是红黑树epoll_create对应的内核态函数如下该函数位于/fs/eventpoll.c,该文件是epoll的实现文件int epfd=epoll_create(size);可以发现epoll_create的size参数是没有使用的,但是size大小必须大于0否则会返回-EINVAL的错误,接着进入sys_epoll_crea...

2019-05-19 12:57:39 208

原创 fork源码剖析

fork是复制进程进程是一个正在运行的程序,是资源分配的最小单位,系统管理进程是依靠对进程控制块(PCB)的管理完成的,每个进程的产生分两步,一是:分配PCB,二是准备进程实体,如分配内存空间等。fork()创建进程,fork()调用一次,返回两次,子进程的返回值是0,父进程的返回值是子进程的新ID。文件共享在fork之前父进程打开的文件子进程才能使用,一个进程打开的文件描述符是在PCB...

2019-05-19 12:56:39 574

原创 两种高效的并发模式:半同步/半异步模式、领导者/追随者模式

半同步/半异步模式同步:程序完全按照代码顺序执行;异步:程序的执行需要由系统事件来驱动。常见的系统事件包括中断,信号等。半同步/半异步模式中,同步线程用于处理客户逻辑,即逻辑单元;异步线程用于处理I/O事件,即I/O处理单元异步线程监听到客户请求之后,就将其封装成请求对象插入请求队列,请求队列通知某个工作在同步模式的工作线程来读取并处理该请求对象。具体选择哪个工作线程取决于请求队列...

2019-05-19 12:52:45 357

原创 死锁

概念:多个进程或线程访问一组静态资源的时候,出现的永久阻塞的问题。产生的原因:1、系统资源不足2、程序运行推进的顺序不当3、资源分配不当死锁产生的四个条件1、互斥2、请求和保持3、不可抢占4、循环等待避免死锁只要打破其中某一个条件就行...

2019-03-29 15:47:39 92

原创 malloc和new的区别

1、malloc开辟的内存在堆上 new不一定(new开辟的内存区域称为自由存储区域) malloc只负责开辟内存,没有初始化功能,需要用户自己初始化;new不但开辟内存还可以进行初始化,比如new int(10)表示在堆上开辟了一个4字节int整形内存,初始化为10;new int[10]()表示在堆上开辟了一个包含10个整形元素的数组,初始值都为0;2、malloc为函数,开辟...

2019-03-29 15:23:14 99

原创 select、poll、epoll

Linux下实现I/O复用的系通调用主要有select、poll、epollselect系统调用用途:在一段指定时间内监听用户感兴趣的文件描述符上的可读、可写、异常事件函数原型:int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)nfds用来设...

2019-03-22 17:29:02 118

原创 Reactor模式和Proactor模式

reactor模式同步I/O模型通常用于实现reactor模式 模式特点:主线程只负责监听文件描述符上是否有就绪事件发生,如果有的话就将该事件通知给工作线程,除此之外,主线程不做其他的事情,读写数据,接受新的连接和处理新的客户请求均在工作线程完成。 同步I/O模型通常用于实现reactor模式的工作流程(epoll为例):1、主线程往epoll内核事件表注册socke...

2019-03-22 16:39:50 183

原创 TCP协议

TCP:特性:面向连接的、可靠的、字节流服务 全双工模式使用TCP协议通信的双方必须先建立连接,才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP协议的这种连接是一对一的。因此目标是个多个主机地址的应用程序不能使用TCP服务。字节流服务的概念:发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,也就是说当发送端应用...

2019-03-13 23:10:23 946

原创 进程和线程的区别

1、概念具有一定独立功能的程序关于某些数据结合上的运行活动,进程是系统进行资源分配和调度的一个独立单位线程:线程是进程的一个实体,是进程内部的一条执行序列,是CPU的基本单位,一个进程至少有一条线程,main函数的执行序列为主线程,通过线程创建函数并调用的执行序列为函数线程。二者区别:1、进程有独立的地址空间,一个进程崩溃后不会对其他进程产生影响,线程只有自己的栈和局部变量,没有单...

2019-03-09 18:59:43 168

原创 线程

线程同步的实现方式:信号量、互斥锁、条件变量、读写锁影响线程安全的因素:1、线程同步 2、线程安全的函数如strtok和strtok_r;有关线程的命令:ulimit -a 显示所有限制ulimit -s 显示栈的信息ulinit -u 显示用户最大进程数查看线程 ps -eLf L:显示线程2、多线程执行fork父进程多个线程,子进程只启用一...

2019-01-19 18:31:19 187

原创 构造函数&析构函数&拷贝构造函数&

构造函数:初始化对象的内存空间析构函数:释放对象所占资源1、this指针:指向的是对象的空间地址2、构造函数、析构函数的顺序 先构造的后析构,后构造的先析构3、构造函数、析构函数能不能重载 构造函数可以重载 析构函数不可以重载4、构造函数与析构函数能否自己调用 构造函数不可以自己调用 析构函数可以自己调用,但...

2019-01-19 17:50:13 261

原创 类和对象

类不占空间,对象才占空间模拟实现:c++三大特征:封装、继承、多态c++三个访问限定符:1、public:任意位置(类中、类外)可见2、protected:在本类中和子类类中访问3、private:在本类类中访问行为一般设为公有成员变量方法,属性设为私有成员变量栈上的特点:系统开辟,系统释放堆上的特点:用户开辟,用户释放类中的六个默认函数1、构造函数...

2019-01-19 11:35:16 146 1

原创 开辟内存new/malloc&作用域

c++中开辟内存用new关键字 如:int *p=new int;释放内存 用delete 如delete p;new 的作用:1、开辟内存 2、初始化 3、开辟数组 4、释放数组c++中开辟一维数组 如 int *cppp=new int[10] ;释放数组 delete []cppp;c语言中开辟一维数组:int *cp=(int *)malloc(sizeof(int)...

2019-01-10 23:16:37 956

原创 c/c++的相互调用&引用

c/c++的相互调用:由于在c和c++中函数符号解析不同,因此不能直接在一方调用另一方1、c++中调用c语言的函数:.在cpp加extern"c"如extern " c"{}c中调用c++:1、c++源文件可以修改 .cpp加extern"c";2、c++源文件不可修改则加中间层,即自己写一个中间文件,在中间文件引入不可修改文件和extern " c"引用:引用...

2019-01-10 22:55:10 609

原创 栈&调用约定&函数默认值&inline函数

.data存放已初始化但初始化不为0的数据.bss存放未初始化或初始化为0的数据强弱符号强符号:已初始化的全局变量弱符号:未初始化的全局变量规则:1、两强符号——重定义错误2、一强一弱,选强符号3、两弱符号,针对编译器不同选择不同函数堆栈调用:move 移值 lea 移地址四个寄存器:eax ebx ecx edxebp 栈底指针寄存器...

2019-01-10 22:34:26 206

原创 僵死进程

我们一般所说的32位/64位指ALU的宽度 一次处理的数据宽度malloc申请空间时,malloc函数调用成功只会分配虚拟地址空间上的一段地址空间,物理空间只要在使用时才会由系统分配给进程僵死进程:PCB存在,进程主体释放产生条件:子进程先于父进程结束,父进程未获取到子进程的退出码,从而子进程不得不保存退出码,导致整个PCB无法释放父进程获取子进程的退出码:pid_t w...

2019-01-07 14:49:11 543

原创 进程fork()

进程的创建:pid_t fork(void);系统调用函数fork出错 返回-1,fork函数调用一次,返回两次在原来的进程返回新进程pid(不可能为0),在新进程中返回0;即在父进程执行非0,在子进程执行0#include<stdio.h>#include<stdlib.h>#include<string.h>#inclu...

2019-01-07 14:29:56 1163

原创 进程间通信

进程间通信有:管道、信号量、共享内存、消息队列、套接字管道分为有名管道和无名管道区别:有名管道在任意两个进程间进行通信;两个进程一读一写,当管道为空写端没有关闭,read阻塞,写端关闭,读端read返回0无名管道只能在父子进程间通信写入管道的数据都存在内存中,普通数据存在磁盘中;管道通信属于半双工半双工:双方都可以互相通信但不可同时进行通信,例如:对讲机全双工:...

2019-01-03 21:18:29 111

原创 数据类型转换的本质原因

数据类型转换的本质原因有两个:1、窄变宽:左边补符号位例子:#include<stdio.h>int main(){char a=-1; // 1111 1111char b=1; // 0...

2018-08-04 19:19:21 1571

原创 free崩溃的原因

free 崩溃有四个原因:(1):越界例如:int main(){int *p1=(int *)malloc(20)for(int i=0;i<20;i++){p1[i]=0;}free(p1);return 0;}系统创建内存时创建了20个字节,但在运用是使用的是20格,因此越界导致释放崩溃。(2)指针移动例如:int mai...

2018-07-22 18:11:22 1841

原创 根据等式,求解n进制问题

假设在n进制下,下面的等式成立,567*456=150216,n的值为(D)A .9 B.10 C.12 D.18解:将上述等式转换成n进制的等式,即(5n^2+6n+7)*(4n^2+5n+6)=20n^4+24n^3+28n^2+25n^3+30n^2+36n+42=20n^4+49n^3+88n^2+71n+42=n^5+5...

2018-07-20 15:15:27 460

空空如也

空空如也

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

TA关注的人

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