自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 排序算法——交换排序(快排*)和归并排序

上篇文章介绍了插入排序和选择排序,详见https://mp.csdn.net/postedit/975244953交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。交换排序分为冒泡排序和快速排序。3.1冒泡排序3.1.1基本方法①比较相邻的元素...

2019-07-29 13:44:05 527

原创 排序算法——插入排序和选择排序(堆排*)

●前言:生活中很多地方都需要排序,比如我们网上购物的时候总会希望价格、综合评价、距离等由低到高显示,这就要排序。相关概念1>排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。2>稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i...

2019-07-27 17:28:23 519

原创 图解多态原理

●虚函数表:class Base{public: virtual void Func1() { cout << "Func1()" << endl; }private: int _b = 1;};void test(){ Base b; cout<<sizeof(b)<&...

2019-07-06 17:06:46 306

原创 菱形继承那些事

继承是C++三大特性之一,而继承又分为单继承和多继承,将单继承和多继承组合起来就成了复杂的菱形继承,本文重点讲菱形继承带来的问题和如何解决该问题。●回顾知识:单继承:一个子类只有一个直接父类时称这个继承关系为单继承。多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。●菱形继承一、什么是菱形继承?菱形继承是多继承的一种特殊情况,由单继承和多继承构成,...

2019-07-06 14:43:44 140

原创 HTTP协议

目录一、什么是HTTP协议二、认识URL三、urlencode和urldecode四、HTTP请求和响应五、HTTP服务器的实现一、什么是HTTP协议1.HTTP协议:即超文本传输协议,是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。2.HTTP是基于TCP的应用层协议,它不关心数据的传输细节,主要用来规定客户端和服务器端的数据传输格式。设...

2019-05-18 18:05:53 717

原创 进程间关系和守护进程

●进程间关系:一、进程组1.进程组是一个或多个进程的集合。2.每个进程除了有一个进程id外,还属于一个进程组。3.通常,进程组与同一作业相关联,可以接受来自同一终端的信号。4.和线程组相似,每个进程组有唯一的进程组ID,每个进程组有一个组长进程(组长进程ID等于进程组ID)。5.组长进程可以创建一个进程组,然后终止。6.和线程组不同的是,线程组组长终止,那么线程组就终止...

2019-05-15 16:26:13 253

原创 重入和线程安全

一、概念线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。二、情况分类1.常见的线程不...

2019-05-15 13:06:14 120

原创 线程池

一、什么是线程池线程池=一个或多个线程+任务队列 线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets...

2019-05-15 11:58:17 139

原创 生产者消费者模型

一、什么是生产者消费者模型?如下图所示,和我们生活中买东西一样,生产者将货物生产好了放到超市,我们消费者去超市消费货物。二、为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是...

2019-05-13 19:40:23 242

原创 进程控制——进程终止/程序替换详解

●进程终止一、进程退出场景1.代码运行完毕,结果正确。2.代码运行完毕,结果不正确。3.代码异常终止。二、进程常见退出方法 ●正常终止(可以通过 echo $? 查看进程退出码):1.调用_exit函数#include <unistd.h>void _exit(int status);参数:status 定义了进程的终止状态,父进程通过wa...

2019-05-11 15:08:59 261

原创 进程控制——进程创建/进程等待

目录●进程创建:一、fork函数二、vfork函数 ●进程等待一、进程等待的必要性二、进程等待的方法三、进程等待实例●进程创建:一、fork函数1.定义:fork函数用于从已经存在的进程中创建一个新的进程。新的进程称为子进程,而原来的进程是父进程。#include <unistd.h>pid_t fork(void);返回值:子进程中...

2019-05-11 13:42:08 409

原创 进程间通信——信号量

一、什么是信号量 信号量本质是一个用于描述资源数目的计数器。主要用于同步和互斥。相关概念:1.临界资源:两个或多个进程看到的一份公共资源叫做临界资源。2.临近区:各个进程访问临界资源的代码叫做临界区。3.互斥:在临界区中,通过临界区访问临界资源,在某一个时刻只能有一个进程。(独占、排他)4.同步:为了解决有的进程周而复始的占有资源而其他进程长时间得不到资源的问题,...

2019-05-10 17:58:35 376

原创 进程间通信——共享内存

目录●什么是共享内存 ●共享内存的原理 ●共享内存的特点 ●共享内存的数据结构●共享内存函数●server/client实例●什么是共享内存? 两个或多个进程共享一段特定的存储区,这块存储区就叫做共享内存。进程可以将共享内存挂接到它们自己的进程地址空间中,这样一来,不同的进程就可以进行读取或修改共享内存中的数据,实现了进程间通信。 ●共享内存...

2019-05-10 13:13:47 856

原创 进程间通信——消息队列

一、什么是消息队列1. 消息队列提供了⼀个从⼀个进程向另外⼀个进程发送⼀块数据的⽅法。2.每个数据块都被认为是有⼀个类型,接收者进程接收的数据块可以有不同的类型值。(数据块:即消息队列)3.消息队列也有管道⼀样的不⾜,就是每个消息的最⼤⻓度是有上限的,每个消息队列的总的字节数是有上限的,系统上消息队列的总数也有⼀个上限。二、消息队列的结构消息队列在内核中可以认为是一个链...

2019-05-06 20:14:51 753

原创 自动化构建工具Makefile/makefile

目录一、makefile的背景二、makefile的编写及其原理 1.如何编写makefile 2.依赖关系: 3.依赖方法: 4.makefile原理: 5.项目清理:一、makefile的背景1. 也许长期使用Windows编程的程序员不知道...

2019-05-06 17:10:35 289

原创 下载进度条(彩色)

写一个下载进度条的demo: 1 #include<stdio.h> 2 #include<unistd.h> 3 #include<string.h> 4 int main() 5 { 6 int i=0; 7 char buf[102]={0}; 8 const char* label="|/-\\"...

2019-05-05 20:53:40 139

原创 Linux编辑器vim使用总结

目录一、vim的基本模式二、vim的基本操作三、vim正常模式命令集四、vim底行模式命令集五、vim简单配置一、vim的基本模式 vim常用的三种模式分别是命令模式、插入模式和底行模式,各模式的功能区分如下:1.正常/普通/命令模式: 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式下,或者到底行模式。2.插入模...

2019-05-05 18:54:37 304

原创 进程间通信——管道

目录●进程间通信 1.进程间通信的目的 2.进程间通信的本质 3.进程间通信的分类●管道一、什么是管道?二、管道实现原理:三、匿名管道: 1.匿名管道是基于文件描述符的通信方式。 2.匿名管道原理: 3.站在文件描述符角度理解管道 4.匿名管道读写...

2019-05-02 14:49:01 188

原创 内存管理有关题目

一、判断变量的存储位置看一道关于代码的题:int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = {1, 2, 3, 4}; ...

2019-04-25 21:31:30 237

原创 C/C++内存管理

目录一、C/C++中的内存分布二、C/C++中的内存分配方式三、C语言中动态内存管理四、C++中动态内存管理五、malloc/free和new/delete的异同点一、C/C++中的内存分布一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址...

2019-04-24 22:01:54 147

原创 实现一个Date类

日期类是一种很常用的类,但是C++中没有封装,因此就要我们手动封装。创建类一定要生成其默认的成员函数:构造函数,拷贝构造函数,运算符重载,析构函数本文实现的日期类有以下功能: 1.判断两个日期的大小关系 2.日期加减天数 3.日期加等减等天数 4.日期的前置后置自加和自减 5.两个日期相差天数 6.输出日期日期类的声明:#pragma o...

2019-04-24 17:55:53 294

原创 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针

指针数组和数组指针:指针数组:是一个数组,数组每个元素是一个指针,所占空间大小由数组决定。数组指针:是一个指针,指针指向一个数组,所占空间大小为4个字节(32位平台)。int *p1[5];//p1先和[ ]结合,因此p1是数组,只不过数组元素为 int * 型;int (*p2)[5];//p2先和“*”结合,因此p2是指针,只不过该指针指向 int 型数组。区分数组指针...

2019-04-19 16:51:50 151

原创 模拟实现str系列和mem系列库函数

1.实现strcpy :拷贝字符串char* my_strcpy(char* dest, const char* src){ assert(dest); assert(src); char* ret = dest; while (*dest++ = *src++ !='\0') { ; } return ret;}注意:strcpy会将\0也拷贝,但是需要注意目标地...

2019-04-19 15:12:32 140

原创 可变参数列表源码分析及函数设计

目录一、什么是可变参数?二、可变参数的实现三、可变参数源码四、模拟实现printf函数一、什么是可变参数? 可变参数是一个比较有意思的实现,通过将函数实现为可变参数的形式,可以使得函数可以接受1个以上的任意多个参数。 一般情况下,我们写的函数参数的数目是固定不变的,调用函数时要给出相应的实参,但有些时候,为了做同样的事情,由于参数个数不同,我们总...

2019-04-18 18:29:19 148

原创 图解结构体内存对齐

目录为什么要内存对齐?如何进行结构体对齐?如何让结构体按照指定的对齐参数进行对齐?如何知道结构体中某个成员相对于结构体起始位置的偏移量?为什么要内存对齐?1. 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的; 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2. 性能原因: 数据...

2019-04-14 19:05:51 443

原创 C++笔记:缺省参数与函数重载详解

一、缺省参数1.概念:缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。(我其实把它理解为是一种备胎行为)void Test(int a = 0){ cout<<a<<endl;}int main(){ Test(); // 没有传参时,使用参数的默认值0 Test(10); /...

2019-04-14 16:37:24 196

原创 GET和POST实质区别

目录●POST和GET的区别(常规回答):●POST和GET是什么?●上述常规回答说GET的参数有限制?●上述常规回答说POST比GET更安全?●网上有结论说POST请求会产生两个数据包?(有待考证)●GET和POST选择哪个?这是一个比较常见的问题了......GET:从指定资源请求数据。POST:向指定资源提交数据。●POST和GET的区别(常规回答):...

2019-04-12 15:55:32 206

原创 论智能指针的发展史

RAII:1.RAII的由来: 我们写的有关资源管理的代码如果出现bug,会导致下面的问题:●malloc出来的空间,没有进行释放,存在内存泄漏的问题。●异常安全问题。如果在malloc和free之间如果存在抛异常,那么还是有内存泄漏。这种问题就叫异常安全。 也许会有人说,那我写代码的时候小心点就行了,但是天算不如人算,当工程量浩大的时候总避免不了这样那样的问...

2019-04-12 12:02:09 202

原创 文件系统之inode和软硬链接

看了好几篇博客都没看懂inode软硬连接到底是个什么鬼,可能是大佬的博客太高深莫测,然后突然开窍......目录一、文件和硬盘二、inode三、硬链接四、软链接五、区分软硬链接一、文件和硬盘1.硬盘的最小存储单位叫扇区,每个扇区512字节。2.文件是存储在硬盘上的,我们通过系统调用读取文件其实是在读取硬盘,而操作系统读取硬盘时并不会一个扇区一个扇区读取,这样太慢...

2019-04-10 14:29:11 1029

原创 Linux下的静态库与动态库使用详解

一、库 库是已经写好的成熟的可以供人们复用的代码。操作系统暴露了自己的部分接口供我们使用,但是由于接口太复杂,有心的开发者就将这些系统调用接口进行了二次封装形成了库,这对于我们小白来说方便了很多。二、静态库1.什么是静态库? 程序在链接的时候把汇编生成的二进制目标文件(.o)与库的代码一起链接打包到可执行文件中,程序运行的时候将不再需要静态库 。这样的链接方...

2019-04-10 12:35:35 298

原创 异常处理

一、C语言异常处理方式1. 终止程序,如assert,缺陷:代码直接崩溃难以接受。如发生内存错误,除0错误时就会终止程序。2. 返回错误码,缺陷:需要自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。void Reverse(char* src,char* dst){ assert(src); assert(dst); ...

2019-04-08 22:25:42 115

原创 C++四种强制类型转换

一、什么是强制类型转换?简单来说强制类型转换就是将某一类型的变量强转成另一种类型的变量。二、C语言中的强制类型转换?1.隐式类型转换:所谓隐式,就是我们没有写出来,而是编译器自己去识别。需要注意的是,隐式类型转换只能转换相近类型的,比如int/char/double这些都可以隐式类型转换,但对于int和int*这种不相关的类型就需要强制类型转换。2.显式类型转换:对于不相关类型,需...

2019-04-08 20:35:44 444

原创 线程—POSIX线程库

一、什么是线程? 1.线程是进程的一个执行流,在一个进程内部运行的多种执行流。 2.Linux下没有真正的线程,是用进程模拟的,因此线程也叫轻量级进程。 3. 线程在进程的进程地址空间运行,第一个pcb称之为主线程,一个进程至少有一个线程。二、线程和进程共享和私有资源? 1.线程和进程共享: 数据段,代码段 、文件...

2019-03-27 16:23:11 524

原创 单例模式—懒汉和饿汉

一、什么是单例模式? 顾名思义,一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。二、怎么实现? 既然只能...

2019-03-18 17:17:53 287

原创 程序的编译链接过程

我们所写的程序要形成一个可执行文件中间可是要经过复杂的过程的:1.组成一个程序的每个源文件通过编译过程分别转换成目标代码。2.每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。3.链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链 接到程序中。我们写好的源文件运行成为一个可执行程序的过程:....

2019-03-18 16:28:08 161

原创 基于HTTP协议的共享目录

目录一、什么是共享目录?二、实现流程:三、线程池创建四、TCP建立网络通信五、HTTP请求:六、HTTP响应: 列表展示、文件下载、文件上传、七、断点续传分块传输一、什么是共享目录? 共享目录本质上就是一个实现了一个支持多人同时访问的HTTP服务器,在这个服务器中实现了目录列表、文件下载和文件上传的功能。二、实现流程:...

2019-03-12 23:16:27 1827

原创 C++模板总结——模板特化与类型萃取

一、模板特化 在原模板的基础上对特殊类型进行特殊化。分为函数模板特化和类模板特化。二、函数模板特化特化步骤: (前提要有一个基础的函数模板) //1.template后加&lt;&gt; 2.函数名后加&lt;指定type&amp;&gt; 3.形参表要和基础类型一样//基础模板template&lt;class T&gt;bool IsEqual(...

2019-03-09 09:04:39 249

原创 高并发内存池到底高在哪?

目录一、什么是内存池?二、为什么需要内存池?三、常见内存池是如何设计的?四、实现一个高并发的内存池 一&gt;ThreadCache: 二&gt; CentralCache: 三&gt;PageCache: 四&gt;系统堆 五&gt;该项目的优点 六&gt;当前存在的问题和改进?一、什么是内存池? 内存池是一种提...

2019-03-06 20:15:34 395

原创 C++模板总结—实例化和特化

一、什么是模板?       照猫画虎,照葫芦画瓢,所谓模板,就是代码的基本结构和内容,但该代码与类型无关,提高代码的复用。模板是泛型编程的基础。模板分为函数模板和类模板。二、函数模板1.函数模板的概念:该函数模板与类型无关,根据实参类型产生特定的函数版本2.格式:template&lt;typename T1,typename T2,...&gt;返回值类型 函数名(参数...

2019-02-08 23:49:44 1221

原创 操作系统信号部分总结

一、信号的概念1.信号:就是通知别人发生了某件事情。在生活中,我们会订外卖,当配送员打电话告诉我们外卖到了的时候实际上就是在向我们发信号。操作系统中的信号是在某件事情发生时操作系统对进程的通知机制,也可以叫做软件中断。与硬件中断不同的是,硬件中断程序会直接崩溃,而软件中断(例如死循环)时,操作系统会发现到这个异常,并向产生中断的进程发信号,进程从用户态切换为内核态去处理异常。2.操...

2018-12-01 23:27:46 509

空空如也

空空如也

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

TA关注的人

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