自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

赵小厨的博客

优秀是一种习惯

  • 博客(30)
  • 收藏
  • 关注

原创 C++设计模式——八大设计原则

引言在学习的过程中,我通常会分为三步,吸收消化、表达出来、教会他人。如果能达到通俗易懂的方式教会他人,那必定对该知识点十分熟悉。所以我也想尝试通过将设计模式给写出来、表达出来、使自己对设计模式有更加深刻的一个理解,同时也给别人参考学习。如果有不正确的地方,欢迎纠正。概述设计模式体现的是一种思想,理解和掌握了设计模式,并不是说记住了 23 种设计场景和解决策略(实际上这也是很重要的一笔财富),...

2019-10-03 21:47:40 1267 1

原创 数据结构——树基本概念及其遍历

树1.概念树结构是一种描述非线性层次关系的数据结构在一个树结构中,有且仅有一个结点没有直接前驱,这个结点就是树的结点。除根结点外,其余每个结点有且仅有一个直接前驱。每个结点可以有任意多个直接后继。2.树的术语根:有且仅有一个无直接前驱结点的结点结点的度:结点拥有的子树的数量叫做结点的度树的度:树内结点的度的最大值叶子:终端结点结点的层:从根算起。根为第一层,往下则+1层...

2019-10-24 21:56:34 279

原创 Git常用指令

Git常用指令一般来说,日常使用只要记住下图 6 个命令,就可以了。但是熟练使用,恐怕要记住 60~100 个命令。下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库在当前目录新建一个 Git 代码库$ git init新建...

2019-10-07 15:30:41 145

原创 C++设计模式——装饰者模式(Decorator模式)

装饰者模式概念装饰者模式是在不必改变原类文件和继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象(装饰器)来动态添加功能的对象装饰者模式提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合UML图Component(抽象构件):提供一个抽象接口,以规范准备接收附加装饰的对象。ConcreteComponent(具体构件):定义一个将要接收附加装饰的类。D...

2019-10-07 15:18:56 870

原创 C++设计模式——观察者模式(Observer 模式)

观察者模式概念定义了对象间的一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(被观察者)。当主题对象的状态发生更改时,会通知所有观察者,让它们能够自动更新。被观察的对象无需指定观察者,通知(可携带参数)会自动传播。观察者自己决定是否订阅通知。Observer 模式应该可以说是应用最多、影响最广的模式之一,在MVC实现了业务逻辑和表示层的解耦个人也认为 Observer 模式是软...

2019-10-06 15:25:41 455 2

原创 C++设计模式——策略模式(Strategy模式)

策略模式概念定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。Strategy 可以使算法独立于使用算法的客户端GOF定义的UML图例子不使用策略模式时假设有一个APP,是中文版的,现在业务拓展需要支持英文版、法语版、德语版等等。大部分初学者的思路应该如下1.定义枚举类2.大量if else 或者 switch case判断,再实现具体内容enum Langua...

2019-10-05 22:49:43 840

原创 C++设计模式——模板模式(Template模式)

模板模式概念对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现(变化),但是逻辑的框架是相同的(稳定)。模板方法模式是一种代码复用技术GOF定义的UML图有许多模式都和模板模式非常相似,用的都是相同的手法。将变化的部分延迟到子类中实现模板方法模式是设计模式行为型中最简单的一种设计模式。在实际中你甚至可能经常用到,只是你自己不知道它是一种设计模式罢了举个例子#inc...

2019-10-05 18:33:36 335

原创 C++设计模式——建造者模式(Builder模式)

Builder模式

2019-10-05 15:05:16 678

原创 C++设计模式——单例模式(Singleton 模式)

单例模式解决什么问题?保证一个类仅有一个实例,并提供一个访问它的全局访问点,例如数据库创建等,通常此类对象只需要实例化一次如何实现?将构造函数声明为私有的或者保护的,不让外部直接创建该对象提供一个静态指针和静态方法,提供全局的访问点分类1.懒汉模式:在程序运行时,调用到该对象再创建该对象。加载类时比较快,但运行时获取对象的速度比较慢;线程不安全。无论是饿汉还是懒汉模...

2019-10-05 13:09:52 952

原创 C++设计模式——抽象工厂模式(AbstactFactory 模式)

抽象工厂模式什么是抽象工厂模式?为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类GOF定义的UML图那么如何理解这个UML图?假设产品现在有苹果品牌的手机和电脑、同时也有华为手机和电脑。那么手机作为产品的抽象类,可以派生出苹果手机、华为手机同理电脑作为产品的抽象类,可以派生出苹果电脑、华为电脑那么我们可以建立一个抽象工厂(提供生产手机和电脑的接口),再分...

2019-10-04 16:41:03 271

原创 C++设计模式——工厂模式(Factory 模式)

工厂模式什么是工厂模式?工厂模式是一种创造型的模式通过绕开new的方法去创建对象,避免创建对象(new)过程中所导致的紧耦合,使得具体化类的工作延迟到了子类中定义创建对象的接口,封装了对象的创建GOF定义的UML图Factory(抽象类):提供创建对象共同的接口,提供派生类继承ConcreteFactoty(具体工厂):继承于Factory,负责创造具体的产品Product(...

2019-10-04 12:48:02 520 2

原创 C++常见面试题

引言总结一下最近面试经常碰到的一些问题、以及从网上摘录的一些常遇到的面试问题。1.externextern"c"修饰函数,则说明告诉编译用C的规则去编译该函数修饰变量或函数,则说明该变量或函数在别的文件中定义,可以在本编译单元中使用(编译单元是指本单元的源文件和对应的.h文件)2.Static修饰局部变量:静态变量存储在静态区,生命周期和程序一样,限制作用范围在编译单元内有效,...

2019-09-28 14:01:58 190

原创 Linux线程池

什么是池?池是一组资源的集合,这组资源在服务器启动之初就被创建并初始化开始处理客户请求的时候,如果它需要相关的资源,就可以直接从池中获取服务器处理完一个客户连接后,可以把相关的资源放回池中为什么要创建线程池?当有客户端连接时,创建耗时为:线程时间+处理时间+销毁线程时间(耗时T1+T2+T3)若需要大量的线程来完成任务,且完成任务的时间比较短,这样花费在T1和T3上面的时间比较...

2019-08-20 17:31:47 162

原创 Linux高并发服务器——epoll服务器

epoll服务器一、概述epoll是Linux下多路复用IO接口select/poll的增强版本epoll能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率select使用轮询来处理,随着监听 fd 数目的增加而降低效率。而epoll只需要监听那些已经准备好的队列集合中的文件描述符,效率较高。二、epoll API头文件 #include <sys/epol...

2019-08-19 16:25:18 888

原创 Linux高并发服务器——select服务器

高并发服务器select服务器属于多路I/O转接服务器的其中一种服务器模型select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精力多路...

2019-08-16 16:20:16 1885

原创 Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)

为什么要线程同步?线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突看一个例子两个线程并行对全局变量count++ (采用一个val值作为中间变量,模拟寄存器工作方式,后面会详解)#include <stdlib.h>#include <pthread.h>#include <unistd.h>...

2019-08-15 16:42:54 343

原创 Linux线程

注: 本文章参考其他博客加上自身的理解总结而成一、概念线程定义一个线程指的是进程中一个单一顺序的控制流,也称为轻量进程(LWP)一个进程可以有很多线程,每个线程并行执行不同的任务线程会拥有自己的堆栈(不共享),但是它与同一进程中的多个线程将共享该进程中的全局变量、文件描述符等系统资源进程和线程的区别根本区别:进程是最小的分配资源的单位,线程是最小的执行单位。通信机制:对于不同...

2019-08-13 16:59:49 109

原创 Linux网络编程——SOCKET

一、预备知识大端模式、小端模式大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处;小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。   网络字节序我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小...

2019-08-12 22:25:04 359

原创 Linux网络编程——网络基础

OSI参考模型与TCP/IP参考模型物理层:指的是电信号的传递方式,比如现在以太网通用的网线链路层:负责网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。网络层:负责点到点的传输(这里的“点”指主机或路由器),Internet上的主机通过IP地址来标识,IP协议是构成Internet的基础。传输层:负责端到端...

2019-08-12 17:37:21 106

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

概念什么是消息队列?消息队列亦称报文队列,也叫做信箱。是Linux的一种通信机制,这种通信机制传递的数据具有某种结构,而不是简单的字节流。消息队列的本质其实是一个内核提供的链表,内核基于这个链表,实现了一个数据结构向消息队列中写数据,实际上是向这个数据结构中插入一个新结点;从消息队列汇总读数据,实际上是从这个数据结构中删除一个结点消息队列提供了一个从一个进程向另外一个进程发送一块数据的...

2019-08-10 20:39:57 382

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

一、概念什么是内存共享映射?将磁盘文件的一部分直接映射到内存中共享内存,就是两个或多个进程都可以访问的同一块内存空间,一个进程对这块空间内容的修改可为其他参与通信的进程所看到的映射种类共享映射(share),内存中数据修改时,磁盘对应也同时修改私有映射(private),内存中数据修改时,磁盘不修改内存共享特点实现进程间通信最简单也是最直接的方法就是共享内存——为参与通信...

2019-08-10 16:02:09 405

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

概念什么是信号?信号是linux系统中一种常用的通信机制,A给B发送信号,B在收到信号之前执行自己的代码,收到信号后,不管执行什么程序,都暂停运行,去处理信号,处理完毕后再继续执行原来的程序,是一种软中断。特点由于信号是通过软件方法实现的,具有很强的延时性,对用户来讲,时间非常短,不易察觉每个进程收到的所有信号,都是由内核负责发送,内核处理与信号相关的事件或者名词产生信号的基...

2019-08-08 23:45:54 118

原创 Linux进程间通信——管道

管道什么是管道?一个进程连接到另一个进程的一个数据流称为一个“管道”。匿名管道pipe用于父子间的通信管道最大64K,由环形队列组成需要占用两个文件描述符,分别作为管道读端、写端管道是半双工的,需要确定通信方向父写子读,关闭父读、子写子写父读,关闭子读、父写优点:稳定、经典pipe函数原型头文件:<unistd.h>int pipe(int file_...

2019-08-08 16:38:27 144

原创 Linux进程管理

介绍进程前,我们先来理解一下Linux的虚拟内存虚拟内存(32位)一、程序程序是存放在磁盘文件中的可执行文件,未执行。二、进程程序被执行,运行时被称为进程,代码运行时,所需要的资源会分配到对应的虚拟内存空间中进程默认最大可占用空间为4G,但是并不会给进程分配4G的空间,会根据所占用实际的大小,用多少给多少。每个linux进程都一定有一个唯一的数字标识符,称为进程ID。(一...

2019-08-06 19:54:33 90

原创 Linux文件描述符

文件描述符文件描述符是一个非负整数,Linux用文件描述符来标识每个文件对象,当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。本篇文章主要围绕下图进行讲解流程首先当有一个进程创建时,操作系统的核心部分kernel会为之创建PCB,PCB中存在文件描述符(file struct),文件描述符前三位分别为三种流(输入、输出、错误),当有新的文件创建时,文件描述符会自动...

2019-08-04 23:21:20 123

转载 C++虚指针、虚表

C++多态可分为静态多态和动态多态静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如函数重载动态多态则是利用虚函数实现,在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会执行什么函数重载比较简单这里就不说,今天我们主要来谈一谈虚函数虚表和vptr指针当类中声明虚函数时,编译器会在类中生成一个函数虚表虚函数表是一个存储 类...

2019-08-04 18:41:45 1293

原创 C语言更改控制台字体颜色

/*颜色函数SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),前景色 | 背景色 | 前景加强 | 背景加强);前景色:数字0-15 或 FOREGROUND_XXX 表示 (其中XXX可用BLUE、RED、GREEN表示) 前景加强:数字8 或 FOREGROUND_INTENSITY 表示背景色:数字16 32 64 或 ...

2019-08-04 11:41:31 4097

原创 单向通用链表的封装

单向通用链表封装的链表结构该图纯手画,头结点不存放数据,data指针为空,Next指向下一个结点。(也可以封装成头结点存放数据,代码稍作修改即可)这里用一个用户结构体作为例子,进行测试。typedef struct user{ char acNo[20]; // 用户账号 char acName[20]; // 用户姓名 char acPsw[10]; // 登入密码}U...

2019-08-04 11:28:51 194

原创 C语言内存分区、堆栈的不同

C/C++内存分区首先要清楚一点,程序未运行和运行时是有一点区别的程序运行时主要分区1.栈区2.堆区3.全局/静态区4.常量区5.代码区栈区由编译器自动分配释放,用于存放函数形参、返回地址、返回数据、局部变量数据由高地址向低地址扩展的一块连续的内存区,向下生长的,也就是向着内存地址减小的方向效率高,但分配内存有限,程序员无法控制堆区程序员分配释放的空间,程序结束时可...

2019-08-03 23:56:50 174

原创 内存对齐原则

内存对齐假设有一个结构体如下struct test{ char a; //1 short b; //2 int c; //4};大小是1+2+4=7吗?不对,这个就是内存对齐导致的为什么要内存对齐?1.平台移植原因,不是所有的硬件都能访问任意地址上的数据2.提高效率,牺牲空间,换取时间那么如何计算该结构体大小?拼矩形法一个格子代表一个字节绿色代表 数据占用的空...

2019-08-03 20:50:59 97

空空如也

空空如也

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

TA关注的人

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