自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式-----工厂和抽象工厂

一、简单概念简单工厂:工厂类中,根据条件决定一个接口由哪个具体产品类来实现;工厂方法:创建多个工厂类。各个工厂类中,都对应一个获得接口A实例的方法,用户决定使用哪个工厂;抽象工厂:对工厂方法进行扩展。各个工厂类中,再增加一个获得接口B实例的方法;注:多个工厂类都继承自同一个接口;二、工厂方法模式1、概述工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是那一...

2018-08-13 17:17:49 401

原创 不能实现为虚函数的函数以及原因

(1)只有类的成员函数才能说明为虚函数。(虚函数的目的是为了实现多态,多态和集成有关,所以声明一个非成员函数没有任何意义)(2)静态成员函数不能是虚函数。(静态成员函数对于每一个类只有一份代码,所有的对象共享这份代码,它不归某个对象所有,所以没有动态绑定的必要性,不能被继承,只属于该类);(3)内联函数不能是虚函数。(内联函数在程序编译的时候展开,在函数调用处进行替换,虚函数是进行动态绑定...

2018-08-11 15:34:49 1757

原创 深入理解C++中的多态

一、多态的分类1.静多态:在编译期间就可以确定函数的调用地址,并产生代码。也就是说地址是早早绑定的;其往往是通过函数重载和模板来实现;2.动多态:函数调用的地址不能在编译期间确定,必须在运行时才确定;其主要是通过虚函数来实现;二、动多态1、什么是动多态?简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数;2、动多态的实现虚函数主要实现了...

2018-08-11 15:22:35 551

原创 重载、重写(覆盖)、重定义(同名隐藏)的区别

重载:指在同一作用域中允许有多个同名函数,而这些函数的参数列表不同,包括参数个数不同,类型不同,次序不同,返回值相同与否并不影响是否重载;重写和重定义则有点像,区别就是在写重写的函数是否是虚函数,只有重写了虚函数才能算作是体现了C++的多态性,否则即为重定义;综上,他们的区别如下:...

2018-08-11 14:13:59 976

原创 超详细的八大排序算法的各项比较以及各自的特点

一、八大排序算法的总体比较二、算法各自的特点(具体实现见后面博客)1.快排(1)算法思想选择一个基准元素,将比基准元素小的元素放在其前面,比基准元素大的元素放在其后面,然后在将小于基准值元素的子数列和大于基准元素的子数列按原来的方法排序,直到整个序列有序;(2)优缺点优点:极快数据移动少;缺点:不稳定;(3)效率分析此排序算法的效率在序列越乱的时候,效率越高...

2018-08-09 23:01:56 76023 15

原创 八种排序算法(四)----- 堆排序

堆排过程:先将待排序的数视为完全二叉树(按层次遍历顺序进行编号,从0开始)完全二叉树的最后一个非叶子节点,也就是最后一个节点的父结点。最后一个节点的索引为数组长度len-1,那么最后一个非叶子节点的索引应该是为(len-1)/2.也就是从索引为2的节点开始,如果其子节点的值大于其本身的值,则把他和较大子节点进行交换,即将索引2处节点和索引5处元素交换。交换后的结果如图:建堆...

2018-08-09 22:43:39 318 1

原创 八种排序算法(三)---------冒泡排序、选择排序、插入排序、希尔排序、交换排序

一、冒泡排序具体过程:d代码实现:void bubble_sort(int* arr,int len){ if(arr == NULL || len < 0) return ; bool flag = true; for(int i=0;i<len-1 && flag;i++) { fl...

2018-08-09 19:54:28 794 1

原创 详解缺页中断-----缺页中断处理(内核、用户)

一、什么是缺页中断?进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。二、页面调度算法将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就按照某种策略来废弃整个页...

2018-08-06 18:21:42 63959

原创 fork()部分可能会问到的问题总结(持续更新)

pcb是什么,有什么作用?Pcb是进程管理和控制的最重要的数据结构,每个进程均有一个PCB,其中包含:进程标识符; 处理机的信息(通用寄存器,指令计数器,用户的栈指针); 进程调度信息(进程状态,进程优先级,事件); 进程控制信息(程序的数据的地址,进程同步和通信机制);系统是通过pcb来管理所有的进程;内存的分页管理,页表是什么?在程序中我们使用的是逻辑地址还是物理地址?引入...

2018-08-04 10:00:58 846

原创 fork()的底层实现

 fork之后父进程与子进程的区别进程ID不同;(父进程的返回值是子进程的ID) 子进程中tms_utime  tms_stime  tms_cutime和tms_ustime的值设为0; 子进程不继承父进程设置的文件锁(子进程继承了父进程中的所有互斥锁、读写锁和条件变量(包括他们的状态),在多线程中,另做处理); 子进程的未处理闹钟会被清除; 子进程的未处理信号集设置为空集;子进...

2018-08-04 09:48:35 737

原创 select poll epoll的区别及epoll的底层实现

Select  poll每次循环调用时,都需要将描述符和事件拷贝到内核空间;epoll只需要拷贝一次;这种情况在对于描述符数量不大的情况下还可以,但是当描述符的数量达到十几万甚至上百万的时候,他们的效率就会急速降低,因为每一次轮询都需要将这些所有的socket描述符从用户态拷贝到内核态,会造成大量的浪费和资源开销;      2.Select  poll每次返回后,需要遍历所有描述符才能找到...

2018-08-04 09:41:31 5001 4

原创 深入了解MySQL存储引擎-------InnoDB

如果想看自己的数据库默认使用的那个存储引擎,可以通过使用命令SHOW VARIABLES LIKE 'storage_engine';一、InnoDB存储引擎1.InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID)事务的ACID属性:即原子性、一致性、隔离性、持久性                            a.原子性:原子性也就是说这组语句要么全部执行,要么全部不执行,如...

2018-07-12 09:54:29 31863 4

原创 浅谈MVC设计模式

    最近在整理自己所写的项目时,其中有一个项目利用了MVC设计模式,当时做项目的时候只是简单会使用这个设计模式。今天突然想研究研究它,所以结合网上的一些资料,将MVC设计模式做一个简单的总结概括。    MVC设计模式最大的特点:        可以实现模型的复用:一方面,模型只返回处理结果,并不用关心这些结果如何展现。我们可以提供不同的视图来展现这些        数据;另外一方面,对于同一...

2018-05-30 11:51:05 3141

原创 深入理解Hashtable

一、基本知识Hashtable它是一个散列表,它存储的内容是键值对映射。Hashtale继承于Dictionary,实现了Map、Cloneable、Java.io.Serializable接口。Hashtable的函数是同步的,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。二、优势所在将数据存储在数组中,并通过数组下标搜索会出现两个...

2018-05-19 18:37:52 1670

原创 条件变量与互斥锁的使用

一、条件变量1.说明    条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起;另一个线程使“条件成立”(给出条件成立信号)2.创建和注销条件变量有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量:pthread_cond_t cond = PTHREAD_COND_INITIALIZER动态方式调用p...

2018-05-10 16:09:43 625

转载 C++11标准新特性

学习了!原文章链接:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/index.html新特性的目的右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect For...

2018-05-02 20:43:27 278

原创 八种排序算法(二)-----归并排序

一、算法思想首先将初始序列的n个记录看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2向上取整个长度为2(n为奇数时,最后一个序列的长度为1)的有序子序列。在此基础上,再对长度为2的有序子序列进行两两归并,得到若干个长度为4的有序子序列。以此类推,知道得到一个长度为n的有序序列为止。二、算法实现1.递归实现#include<stdio.h>#in...

2018-05-02 20:00:56 337

原创 八种排序算法(一)------快速排序

算法思想找一个基准值,本题中基准值为数组中最右的元素,再定义两个指针begin(指向首元素)、end(指向尾元素);begin从前往后走找比基准值大的元素,找到后停下;end从后往前走找比基准值小的元素,找到后也停下;然后,交换arry[begin]和arry[end],依次循环操作;当begin与end相遇,将arry[begin]或arry[end]与基准值交换代码实现(递...

2018-05-02 14:16:48 1204 1

原创 浅谈IP分片的大小及其原因

一、IP分片的定义    IP分片是网络上传输IP报文的一种技术手段。IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组,这一过程称为分片。二、进行IP分片的原因    数据链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度。通常要传输的IP报文的大小超过最大传输单位MTU时就会产生IP分片情况,IP分片经常发生在网络环境当中。    例如:在以太网环境当中...

2018-04-22 19:31:22 8180

转载 C++中static的作用

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。   一、面向过程设计中的static   1、静态全局变量   在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:     #include <iostre...

2018-04-22 13:21:18 7818

原创 详解TCP中的拥塞控制

一、拥塞1、概念:在某段时间,如果对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要发生变化,这种情况叫阻塞2、拥塞控制:防止过多的数据注入到网络当中,这样可以使网络中的路由器或链路不致过载。(通过拥塞窗口处理网络拥塞现象的一种机制)        a.前提:网络能够承受现有的网络负荷。        b.拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低1网络传...

2018-04-22 12:59:27 36862 3

转载 从内存布局看C++虚继承的实现原理

准备工作1、VS2012使用命令行选项查看对象的内存布局微软的Visual Studio提供给用户显示C++对象在内存中的布局的选项:/d1reportSingleClassLayout。使用方法很简单,直接在[工具(T)]选项下找到“Visual Studio命令提示(C)”后点击即可。切换到cpp文件所在目录下输入如下的命令即可      c1 [filename].cpp /d1report...

2018-04-18 16:36:07 191

原创 TCP协议中的窗口机制------滑动窗口详解

一、窗口机制的分类在TCP协议当中窗口机制分为两种:1.固定的窗口大小2.滑动窗口二、固定窗口存在的问题如下图所示:我们假设这个固定窗口的大小为1,也就是每次只能发送一个数据,只有接收方对这个数据进行了确认后才能发送第二个数据。在图中我们可以看到,发送方每发送一个数据接收方就要给发送方一个ACK对这个数据进行确认。只有接收了这个确认数据以后发送方才能传输下个数据。存在的问题:如果窗口过小,当传输比...

2018-04-16 17:10:19 66887 12

转载 关于TCP黏包问题的解决思路

原文博客地址:http://blog.csdn.net/zhangxinrun/article/details/6721495TCP粘包分析这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一 .两个简单概念长连接与短连接:1.长连接    Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接...

2018-04-15 19:29:03 1101

原创 详解Linux系统调用过程

Linux系统调用的层次如下:    用户程序-------->C库(即API):INT 0x80------------>system_call------------>系统调用服务例程--------->内核程序    ***API即就是系统提供的C库。系统调用是通过软中断指令INT 0x80实现的。(1)INT 0x80:被封装在C库函数中,执行此指令会让新系统跳转到...

2018-04-14 20:34:18 2527

原创 KMP匹配算法

在说KMP匹配算法之前,我们先来看看与它相近的另一种匹配算法,名曰“暴力匹配算法”1.暴力匹配算法(设有如下的两组字符串)第一位不匹配,则向右移动一位,得到如下的形式B与A依旧不匹配,则继续往后移,当移到如下的形式时:尽管之前的文本串和模式串已经分别匹配到了S[9]、p[5].但因为S[10]和p[6]不匹配,所以文本串会回溯到p[0].从而让是s[5]跟p[0]匹配(S[5]与p[0]肯定匹配失...

2018-04-14 19:11:57 688

原创 加密算法------DES加密算法详解

一、加密算法的分类1.对称加解密算法a.通信双方同时掌握一个密钥,加密解密都是由一个密钥完成的(即加密密钥等于解密密钥,加解密密钥可以相互推倒出来)。b.双方通信前共同拟定一个密钥,不对第三方公开。c.不具有个体原子性,一个密钥被共享,泄漏几率增大2.公私钥加解密算法a.通信双方掌握不同的密钥,不同方向的加解密由不同的密钥完成。二、对称加密算法的代表----DES加密算法原理:该算法是一个利用56...

2018-04-13 21:15:59 111381 38

原创 在C/C++中关于内存问题的总结

一、内存分配方式1.从静态存储区域分配。内存在程序编译的过程中就已经分配好,这块内存在程序的整个运行期间都存在。例如:全局变量和static变量。2.在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数运行结束时,这些存储单元会被自动释放,栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存数量有限。3.从堆上分配,又被称为动态内存分配。程序在运行过程中用malloc和...

2018-04-09 14:41:04 1012

原创 my_memcopy与my_memmove的实现与比较

一.my_memcopy函数#include<stdio.h>void* my_memcopy(void* str1,const void* str2,int count){    char* my_str1 = (char*)str1;    char* my_str2 = (char*)str2;    if(str1 == NULL)        return ;    if(...

2018-04-07 19:24:51 269

原创 程序的编译链接过程详解

首先我们简单了解一下内存布局:程序的编译分为:1.预处理:主要处理源代码文件中的以“#”开始的预编译指令(经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件中)2.编译:将预处理完的文件进行一系列词法分析,语法分析,语义分析以及优化后产生相应的汇编代码文件(生成.s文件)3.汇编:汇编器将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎对应一条...

2018-04-06 19:32:14 709

原创 深入函数调用堆栈--------具体过程详解

通过下面的简单的程序来理解一下函数在调用过程中具体都干了什么:首先我们先来了解一些简单的指令:mov      用来移内存的值                              lea       移地址                                      push        从栈顶入栈pop       从栈顶出栈                        ...

2018-04-06 16:42:07 1467

原创 深入函数调用堆栈-----程序在函数执行前都干了什么

每个函数在开始前都会有一段固定的代码,这些固定的代码主要做三件事:1.主调方栈底地址入栈,让ebp指向当前函数栈底;2.通过esp的减等操作给被调函数开辟栈桢;3.将esp和ebp之间所有的栈内存全部初始化;...

2018-04-06 14:59:08 329

原创 Linux基础总结----网络部分

网络编程ICMP协议:是TCP/IP的一个子协议。是控制报文协议,用在IP主机、路由器之间传递控制消息;(控制消息是指1网络通不通、主机是否可达、路由是否可用等网络本身的消息)HTTP协议:超文本传输协议SSH协议(端口22):网络安全协议,专为远程登录会话和其它网络服务提供安全性的协议;FTP协议:文件传输协议;ARP协议:介于数据链路层和网络层之间,ARP包需要包裹在一...

2018-04-04 08:55:20 521

原创 Linux基础总结-----线程

线程 1.概念:进程内部的一条执行路径或执行序列;(线程是进程的一个实体)2.实现方式:a.用户线程:创建 销毁 管理由线程库完成,无法使用多线程处理器的好处;b.内核级线程:创建 销毁 管理由内核完成,创建代价高,但可以使用多线程处理器的好处; 3. 线程同步互斥锁   条件变量  信号量(1)互斥锁用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就...

2018-04-04 08:53:45 177

原创 Linux基础总结-------进程

进程间的相关知识进程:一个正在运行的程序。一个进程主要包括三个因素1. fork()(1)函数原型:pid_t fork()*pid_t是一个宏,其实质是一个整形,且是一个16位的整形(-32768-----32768),因此linux中可以创建的最大进程数为32768(2)fork的复制过程I:先申请一个pid(如果当前进程数已经达到了版本规定的上限,那么fork时将会出错);II:先进行进程描...

2018-04-04 08:47:19 149

原创 Linux基础部分总结-----基础命令部分

一. 基础命令部分1. 基础命令(1) ps:显示正在运行的进程;(2) mpstat:实时监测多处理器系统上的每个CPU使用情况;(3) vmstat:实时输出系统各个资源的使用情况;(4) tcpdump:用于过滤数据包或制定打开格式;(5) lsof:列出当前系统打开的文件描述符;(6) ipcs:查看信号量;(7) ipcsm:查看已经销毁的信号量;(8...

2018-04-04 08:40:00 161

原创 c++中定义和声明的区别

一.基本理解1.定义和声明的简单说明a.声明就是指给除了当前变量或者函数,或者类什么的名字,不给其中的内容,就是先告诉你有这样一个什么类型的变量或者函数,但是这个变量或者函数的具体信息却是不知道的。就好比跟你介绍一个人的时候,声明就是只告诉你这个人叫什么,但是缺不给你说这个人到底怎么样,他有哪些优点,缺点,喜好问题是什么的。b.定义就不一样了,定义直接告诉你了所有的东西,这个变量是什么,这个函数是...

2018-04-04 08:38:58 13891 1

原创 linux基础总结(四)-------共享内存

一.共享内存的实现原理共享内存区域说白了就是多个进程共享的一块物理内存地址。假设有10个进程将这块区域映射到自己的虚拟地址上,那么,这10个进程间就可以相互通信。由于是同一块区域在10个进程的虚拟地址上,当第一个进程向这块共享内存的虚拟地址中写入数据时,其他9个进程也都会看到。因此共享内存是进程间通信的一种最快的方式。

2017-10-25 09:37:15 322

原创 在c++中普通函数与 内联函数的区别

我们都知道编译的最终产品是可执行程序——— 由一组由机器语言指令组成,在运行程序时,操作系统将这些指令载入到计算机内存中。因此,每一组指令都有一个特定的内存地址。一.普通函数的调用a.当代码执行到函数调用指令时,程序将在函数调用后立即存储该指令的地址,同时将参数复制到堆栈中;b.然后跳到标记函数起点的内存单元当中,执行函数代码,将返回值放回到寄存器当中;c.跳回到地址被保存的指令处

2017-10-24 18:47:22 5325 3

原创 malloc和new之间的区别

1.内存分配失败的返回值malloc内存分配失败返回NULLnew内存分配失败返回bad_alloc;2.需要分配的内存大小new操作符在申请内存分配时,无需指定内存大小,编译器会根据信息自行计算malloc在申请内存分配时,需要用sizeof()计算出其大小3.对数组的处理C++提供了new[]与delete[]来专门处理数组new对数组的支持体现在它

2017-10-23 20:28:14 233

空空如也

空空如也

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

TA关注的人

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