自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 问答 (1)
  • 收藏
  • 关注

原创 VS实现文件的快速搜索

在VS2013下模拟实现了类似Everything的文件快速搜索功能,支持模糊匹配,高亮显示搜索部分。1、首先在linux下有find命令,找一个文件是非常快的。2、在windows下,查找是比较慢的,可以说是很慢的了,所以就想自己实现一个3、使用everything搜索,效率很明显快乐很多使用windows下的搜索是非常慢的,并且不支持拼音搜索和拼音首字母搜索。所以自己实...

2019-08-11 16:14:30 5824

原创 关于fork的问题(详解)

首先看一段代码:#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(void) { int i; for(i=0; i<2; i++){ fork(); printf("-"); } re...

2019-08-09 14:43:23 887

原创 TCP理论基础总结

在学习网络中,在传输层有TCP/UDP两个协议,而TCP是我们需要了解的重点,相关知识也特别的多,下面就来总结一下TCP的各种知识点:在TCP/IP分层模型中,最上面是引用层---HTTP(数据段)、下面是传输层---TCP/UDP(数据段),下层有网络层--IP(数据包),下层是数据链路层---ARP(数据帧)而我们用户处于最高层,C/S收发数据的时候,用户通过每一层协议并添加其相对应的...

2019-08-06 17:37:59 331

原创 C++11初始thread库

在C++中,支持了多线程,下面就来学习一下C++中的线程库thread:先来看下面的代码:#include <thread>#include <atomic>#include <mutex>using namespace std;unsigned long sum;void fun(size_t num){ for (size_t ...

2019-08-06 15:06:14 446

原创 继承/虚拟继承/虚表

继承的分类:1.单继承 创建一个Student的对象,看一下他的内存分布是怎样的: 2.多继承对虚函数进行重写的多继承:3.多重继承4.菱形继承虚拟继承在虚拟继承中,我们可以看到,子类成员和基类成员的存储顺序发生了改变,并且在b对象的前四个字节中存放了一些东西,是我们呢不曾了解的:,下面就来研究一下...

2019-08-06 12:02:23 315

原创 C++11之emplace_back

在之前的学习中,了解到在STL中,进行插入元素的时候,有insert和push两种选择方式,而在有了右值引用和移动语义的时候,就提出了更高效的插入方法:emplace_back,下面来介绍一下C++11新特性中的emplace_back是怎样的:先来看一下代码来分析:#include <vector>#include <string>#includ...

2019-08-04 10:33:35 21408

原创 IO-同步、异步、多路转接

在linux系统中对于一个IO事件来说,实际都分为了两步:等待数据准备好 将数据从内核中拷贝到进程中IO的两个步骤是它的基础,以下讨论各种IO模型的区别就是上面两步的不同,以下来逐个解释:同步IO1.阻塞 在linux中,所有的socket默认都是阻塞方式的,阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。...

2019-08-02 10:32:02 261

原创 json库和jsoncpp库的安装及使用

scons下载地址:wget http://prdownloads.sourceforge.NET/scons/scons-2.2.0.tar.gzJsoncpp 下载地址:wgethttps://nchc.dl.sourceforge.net/project/jsoncpp/jsoncpp/0.5.0/jsoncpp-src-0.5.0.tar.gz这两个直接下载了安装包之后: ...

2019-08-01 08:56:09 2206 1

原创 初识右值引用、移动语句(std::move)、完美转发(std::forward)

左值:可以取地址的、有名字的就是左值右值分为纯右值(C++98中提出)和将亡值(C++11提出)纯右值:用于识别临时变量和一些不跟对象关联的值。比如:常量、一些运算表达式(1+3)等,不能取地址的值 将亡值:在确保其他变量不再被使用、或即将被销毁时,通过“盗取”的方式可以避免内存空间的释放和分配,能够延长变量值的生命期。引用:右值引用:就是对一个右值进行引用的类型,事实上,由于右...

2019-07-24 15:52:31 287

原创 单例模式(C++)

什么是单例模式:一个类只能实例化一个对象叫做单例模式 单例模式也称单子模式、单件模式,通过单例模式可以保证系统中只有一个类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享单例模式的优点:在内存中只有一个对象,节省内存空间 避免频繁的创建销毁对象,可以提高性能 避免对共享资源的多重占用 可以全局访问单例模式的适用场景:需要频繁实例化然后销毁的对象 ...

2019-07-24 10:25:26 223

原创 TCP/UDP套接字编程

在网络编程中的核心就是套接字编程了,以下就给来介绍以下桃套接字编程的步骤,先来看一下所用到的背景知识:IP地址:用于表示一台进行网络服务的主机,现在有IPV4,IPV6,以下编程都基于IPV4 端口号:用来表示一台主机上进行网络服务的进程(uint16_t) 网络字节序:不同的主机有可能字节序不同,为了统一,进行网络通信时,都转为网络字节序(大端) 操作系统提供了一套接口供网络编程对网卡...

2019-07-23 22:29:54 250

原创 初识lamdba表达式(C++11)

在C++11中提出了lamba表达式,那么其究竟有什么用和怎么用,下面就来看一下:lamba表达式根据其用途来说,其终归相当于一个匿名函数,直接在定义处调用,相当于inline函数,但没有函数名,参数、返回值、函数体有lamba其自己的规则来表示;其最方便之处就是省去了函数命名这一步,直接用来使用,很方便,人性化。知道了lamba表达式的作用了,下面就来介绍以下怎么使用ta了:lam...

2019-07-22 13:12:01 272

原创 智能指针——实现shared_ptr

前面介绍的auto_ptr和unique_ptr都存在着些许的缺陷,显得不是那么的“智能”,下面我们来看一下较为智能的shared_ptr的设计思路(一块空间、计数器、锁):与前两者不同的是shared_ptr用一个count的引用计数将指向同一份内存空间的指针,用_count来表示,这样在析构的时候,会判断_count是否为0,再决定是否示释放空间:但是并不仅仅是一个_count就能解...

2019-07-18 18:30:00 233

原创 智能指针——实现unique_ptr

之前介绍了auto_ptr实现,但其并不完美,当然也不“智能”,鉴于之前的auto_ptr实现了简单的资源管理权的转移,下面来看一下另一种思想的unique_ptr。在unique_ptr中为了避免繁琐的拷贝、赋值出现的问题,unique_ptr更像是一个油盐不进的老顽固,别人怎么说,他也不听,直接让别人拿不到自己的东西:C++98中是,将拷贝、赋值定义为private属性;C++11中直接将...

2019-07-18 09:05:50 421

原创 智能指针——实现auto_ptr

之前也了解过一些智能指针的相关知识,其目的是为了解决释放用户动态开辟的空间,方便管理,下面就来看一下最早提出的C++98中的auto_ptr:auto_ptr的实现就是资源管理权的转移。当然,这其中还存在着很多的问题,相当于底层空间的一份资源,只有一个指针能够指向,这并不符合我们平常使用的习惯,相当于拷贝、赋值没有完全的实现。(别人借你用,你直接不还了),当然是行不通的。template...

2019-07-18 08:27:13 260

原创 vim实用、最方便配置

在网上看了很多种方法,存在着很多的问题,其中不乏GitHub中的大佬做出很多的vim配置,但是本人在vim多数写的是C/C++代码,所以下面就来简单的总结一下vim的配置:包括了vim的代码补全、关键字高亮、简易的类似vs下的F5运行,并支持C/C++关键字高亮显示,并且可以定位错误因为vim配置是随用户的,在普通用户下进行修改配置,并不会影响到其他用户。步骤一:下载文件gi...

2019-07-17 11:39:57 502

原创 进程信号

信号:在平常生活中,最常见的信号就是红绿灯了。信号更多的是通知事件的发生,而人们感知到就会做出相应的处理动作。而在Linux中的信号是怎样的呢?比如代码中出现了野指针,访问到非法的内存空间,程序肯定会出错,这时操作系统就会作出相应的事情让程序终止,而操作系统让程序终止就是靠信号作用的。当信号产生后,第一时间不是处理信号,而是先存储。信号的产生 在linux下,结束一个正在用...

2019-07-17 10:51:37 285

原创 线程与多线程(同步、互斥)

什么是线程:线程是进程中的一条执行流,linux下线程是以进程的PCB模拟的,linux下的线程就是轻量级进程,因此linux下的线程是CPU调度的基本单位(线程是实际上处理事件的)。linux下的进程是线程组,进程id==线程组id,所以进程是资源分配的基本单位,线程是进程的一个执行单位,一个进程可以有一个或多个线程,它们共用该进程的所有资源。线程没有独立的内存空间。linux下的...

2019-07-13 11:52:21 394

原创 进程间通信方式(IPC)

因为进程的独立性,所以进程间通信变得麻烦,但有时又需要进程之间的通信:数据传输、资源共享、通知事件(进程退出时需要告知父进程)、进程控制。系统就提供了以下几种进程间通信的方式:一:管道 匿名管道,能在父、子进程间传递数据,一个进程创建一个管道,fork()子进程后,int pipe(int fd[2])创建管道。两个...

2019-07-06 17:59:35 266

原创 进程及进程控制

学习进程之前,先了解一下程序:所谓程序就是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存.....)而进程是与操作系统相关,是指在内存中运行起来的程序,占用一些系统资源,每当一个程序运行,就相应产生一个进程。进程的一些相关信息被放在一个叫进程控制块的数据结构中,称之为PCB。Linux下的PCB是task_struct,其中的一些成员:标示符(PID):表示进程ID,系统...

2019-07-01 20:27:05 481

原创 数据结构----二叉树

数据结构中树形结构的特殊形式:二叉树。二叉树的特点:在每个节点上最多有两颗子树(即不能有度大于2的节点),并且有左右之分。以下是几种特殊的二叉树,满二叉树:一颗二叉树,所有节点都存在左右子树,所有叶子节点都在同一层上 完全二叉树:最后一层可以不完全填充的满二叉树,叶子节点不能中断缺失二叉树的性质:叶子节点数=双分支节点数+1;即n0=n2+1 具有n个节点的完全二叉树深度为l...

2019-07-01 17:12:37 756

原创 STL基础

STL(标准模板库):是C++标准库的重要组成部分。借用STL源码剖析这本书中的一句话:为了建立数据结构和算法的一套标准,并且降低其间的耦合关系以提升各自的独立性、弹性、交互操作性,C++诞生了STL。由此可见STL相对于C++来说是相当的重要了。STL由六大组件构成:容器:各种的数据结构,用来存放数据;分为关联式容器(map、set)和非关联式容器(string、vector、...

2019-06-30 20:57:43 174

原创 内存分配管理

系统中的内存分为栈、堆、全局区、代码区栈:由编译器自动分配释放,参访函数的参数值,局部变量,函数栈帧,函数调用过程。 堆:由程序员自行分配想要的空间大小,C中的malloc等函数,C++中的new 全局区(数据区):存放的是全局变量和静态变量,初始化的存在一起,未初始化的放一起,程序结束后由系统释放 代码区:存放函数体的二进制代码。int tmp1 = 0; //初始化的全局变量(全...

2019-06-29 12:37:10 327

原创 多态(实现)--虚函数

多态是一种事物的多种变现形态,不同的对象去完成一件事时会产生不一样的状态。 实现静态多态的方法之一函数重载指的是在同一个作用域内两个函数的名字相同,但是参数列表必须不同,就构成了函数重载。如下图: 而动态多态必须对函数进行重写(虚函数),并且调用函数的对象必须是指针或引用。什么是虚函数呢?在publ...

2019-06-12 11:26:21 485

原创 STL---空间配置器

空间配置器是STL六大组件之一,它的作用就是为STL中的容器提供高效的管理空间,虽然我们平时没有使用过,但是其存在于每个容器上。因为STL所操作的对象(数值,键值对)都存放在容器当中,当增加新的对象(数值,键值对)时,都是通过new申请的,但有很多不足,1.频繁的向内存申请小块的内存块,容易造成内存碎片,并且影响运行效率2.直接使用malloc和new申请一段连续空间,都会有额外...

2019-04-28 21:14:29 707

原创 HTTP协议

HTTP协议(超文本传输协议)是网络层中很重要的一个协议。 如General图:将以如下的内容梳理HTTP协议。 我们上网用到最多的就是网址,而它的学名叫URL:统一资源定位符。通常上网输入一个网站的域名,就可以连接获取想要的资源,而我们知道在互联网中的...

2019-04-09 17:51:17 713

原创 智能指针 auto_ptr、unique_ptr,shared_ptr

用户申请堆上的空间,会用一个指针指向将其保存起来,以便于对其进行释放,但往往释放的情况有多种,所以有时会忘记释放,有可能会造成内存泄漏。智能指针的提出是为了解决此类问题,将其被封装在一个类中,在构造的时候创建,在析构的时候释放。因为智能指针都是栈空间上类的对象。所以,当函数(程序)运行结束后,会自动调用其析构函数自动释放。 ...

2019-04-06 14:55:27 687

原创 排序算法:稳定性,时间复杂度,空间复杂度

排序是十分常用的算法,所以来一起看以下几种排序:稳定性的定义:若两个数相等,那么排序之后,两个数字的相对位置保持不变时间复杂度:对排序数据的操作次数空间复杂度:算法在执行时所需要存储空间的大小冒泡排序的基本思想:依次比较,相邻是逆序的就交换,经过多次比较,最终得到有序的序列,如下图 ...

2019-03-27 12:08:44 644

原创 多路转接——select、poll、epoll

首先要明确一点那就是IO执行的两个阶段: 1.等待数据准备好 2.从内核中进行数据拷贝在实现的时候分为同步IO:在调用的没有得到结果前,该调用不返回,调用者主动等待这个调用的结果 异步IO:调用发出后,直接返回,不会立刻得到结果,而是让被调用者通知调用者Linux下的五种IO模型:阻塞、非阻塞、信号驱动、多路复用、异步IO。其中,前四种都是同步IO,最后一种是异步...

2019-03-26 20:30:43 830

原创 C++--类的继承

在C++中,类的三大特性:封装、继承、多态。以下,就来总结一下类的特性之一-----继承。首先,要了解什么是继承:是使代码可以复用的最重要的手段,在保持原有类特性的基础上进行扩展,增加一些新的功能(成员函数、成员变量),构成新的类,称之为子类(派生类),原来的类称之为父类(基类)。继承后父类的成员(成员变量、成员函数)变成了子类的一部分。在类的继承中也有三种权限:public(共有),...

2019-02-28 18:06:47 501

原创 TCP----面向连接、可靠性、效率的实现

之前我们看了TCP的报头内容,那么TCP的到底是怎样实现的呢?首先,为了保证TCP的可靠性,都表现在以下几个方面:1.面向连接 首先,TCP是面向连接的,那么什么是面向连接呢?就是在通信之前让双方感知到对方的存在并让发送方发送数据给接收方;在通信之后,关闭连接。那么又是怎么建立/断开连接-----三次握手/四次挥手。 ...

2019-01-16 17:11:12 1357

原创 传输层协议(TCP/UDP)概述

之前有了解一些网络的一些基本知识,那么数据究竟是怎么进行传输的?我们通过一些信息来描述一条在网络上进行传输的数据。将其称为五元组:源IP地址+源端口号+目标IP地址+目标端口号+传输层协议IP地址:用来在网络上标识唯一的主机 用uint32_t(43亿)的数据表示端口号:用来标识一台主机上进行网络通信的进程 用uint_16的数据表示通过五元组标识后,就可以将...

2019-01-15 19:46:56 2090

原创 网络基础知识

网络在我们的生活中可以说十分的重要了,下面我们就一起看一下网络中的一些知识。起初每台计算机都是独立的,在没有网络的时候,两台机器间不能进行通信。但势必就有一种需求,希望两台主机进行信息之间的交流,而网络的提出就可以很好地解决此问题。在计算机刚刚发展的阶段,每台机器都是互相独立的,而随着需求的增加,人们需要机器间进行信息共享,就有了通过网络互联将多态台计算机连在一起,完成数据传输(不同主机上的进...

2019-01-13 12:25:38 476

原创 C++动态内存管理

在学习C++之前,我们了解到C语言实现动态开启内存空间有malloc,realloc,calloc三种方式。都是在堆上开辟。C语言动态开辟空间的方式::malloc指开辟size大小的空间:realloc指将ptr的空间重新开辟为size大小的空间:calloc指分配num个size大小的空间以上三种开辟空间成功返回首地址,失败返回NULL。C++动态开辟空间方式:在...

2018-12-08 13:35:12 600

原创 Linux基础IO

在学习C语言时我们接触过基础IO:输入/输出:fclose、fseek、fread、fwrite(为带缓冲的IO)等。首先,我们应该知道在linux系统下,一切皆文件。普通文件、目录、字符设备、块设备和网络设备(套接字)都被当做文件来处理,所以对文件的操作,就提供了一套统一的接口来实现文件IO。 下面和大家看一下Linux系统中的文件IO:即打开文件、读文件、写文件。在linux系统中,...

2018-12-04 19:28:06 674

原创 引用与指针

在C++中,引入了一个新的定义:引用,引用在C++中的使用频率很高,所以就来看一下什么是引用:引用实际上和原来的变量本质上是一样的,并不是新定义了一个变量,而是给已有的变量取了一个别名,没有独立空间,它和被引用的对象共用一块内存空间。一个变量可以有多个引用。注意:引用时要和被引用的对象类型相同。引用在定义时必须初始化,而指针则不同:指针也是一个变量,在32位操作系统下,它的大...

2018-12-03 16:14:21 683

原创 Linux——进程控制

进程控制:创建进程、进程终止、进程等待。 创建进程: 创建进程:fork()函数,这个接口是以父进程为模板复制创建一个子进程,父子进程代码共享,但数据独有,而创建新的进程往往是希望它去完成不同的功能,函数的返回值可以起到分流的作用(父进程返回子进程的pid,而子进程的返回值为0),来判断父、子进程。而父子进程的优先级,取决于CPU调度。与fork()功能类似的还有vfor...

2018-11-26 17:14:50 640

原创 类与对象

类在C++中十分的重要,所以必须重点掌握好它。 首先,我们要知道类基于面向对象的三大特性:封装、继承、多态。那么,什么是类和对象呢?类:像是一种自定义类型,如C中的struct,是对一件事物的抽象,具体的描述事物的属性和功能。不占用内存。对象:是类的实例化, 是具体的,占用内存。 以下介绍的是类其中的一个特性------封装。封装:就是类+限定符。在类的限定符有...

2018-11-08 21:50:44 541

原创 缺省参数、函数重载

缺省参数:用法:缺省参数是声明或定义函数时为函数的参数指定一些默认值。在调用时,若没有给实参,就用默认值,若给定实参,就用实参的值。缺省参数又分为全缺省参数和半缺省参数:当声明和定义分离时,只能在声明中出现缺省参数。 当声明和定义一起出现时,就不存在在哪个中出现了。。。全缺省参数:半缺省参数:(切记使用半缺省参数时缺省值必须从最右边开始,且不能间隔给出)  ...

2018-10-31 12:53:52 740

原创 C++ 命名空间

命名空间:为什么在C++中会有命名空间呢?在大型的项目中,命名函数和变量起名是一件需要考虑很多,一般都是不同的需求加上特定的前缀,但有时还是避免不了出现同名的情况。因为C语言中有一些缺陷,在不同的环境下,出现同名的变量或函数。为了解决这类问题,C++中就提出了命名空间。目的是将不同模块的标识符放到不同的命名空间中,来避免命名的冲突。一个命名空间就定义了一个新的作用域,命名空间中的所有...

2018-10-28 21:11:01 565

空空如也

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

TA关注的人

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