自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 编译链接运行原理---函数堆栈调用

首先先提出下面五个问题:(1)形参开辟内存吗?由谁开辟?(2)形参的入栈顺序?(3)返回值如何带出?(4)被调用方结束后如何知道回退到调用方栈帧上?(5)函数调用完成如何知道执行下一行指令?举例:进入Debug版本查看该程序的InterX86反汇编代码如下: 有反汇编代码解释可以回答问题(1)形参开辟内存吗?由谁开辟? 形参开辟内存...

2020-08-11 17:34:35 267

原创 Linux---TCP协议的编程流程

TCP协议的编程是基于C/S模型(客户服务器模式):客户端:主动通讯方,数据获取方 服务器:被动通讯方,数据提供方TCP服务器端编程流程(socket编程)1、int listenfd = socket();//listenfd是一种socket文件描述符2、bind();//将listenfd与服务器的IP地址和选用端口号绑定,服务器的IP地址和服务程序选用的...

2020-08-11 17:32:19 285

原创 Linux---一些简单命令

1、grep:在一个字符集合中找到符合条件的行输出,也就是可以起到一个过滤的作用。用法:grep hello file 在file文件中查找hello2、find:在系统中查找一个文件用法:find 路径 -name 文件名find /home -name file 在home路径下查找一个file文件3、管道:| 进程间通信的工具,可以用“|”将一个进程的输出信息...

2020-08-11 17:31:27 200

原创 MySQL数据库--- 事务

一、什么是事务MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执...

2019-08-30 12:59:32 270

原创 MySQL数据库---触发器

一、什么是触发器触发器是一种与表操作有关的数据库对象,当触发器所在表上锅出现指定事件时,将调用该对象,即表的操作事件出发表上的触发器。触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete,...

2019-08-29 19:32:11 3695

原创 数据结构---树

(一)树树是由n(n>=0)个结点的有限集合,n=0空树。以分支关系定义的层次结构,最上面的为根节点,最下面为叶子节点。它具有以下特征:每个节点有多个或者0个子节点; 没有父节点的节点称为根节点(只有一个) 每一个非根节点只有一个父节点 除根节点以外,每个子节点可以分为多个不相交的子树树有许多相关的术语与概念,在学习树的结构之前,我们要熟悉这些概念。子树:除了根...

2019-08-25 22:46:28 279

原创 排序算法---归并排序

归并排序的思想:二路归并排序,先将待排序数组,分为单位为1的一个一个的数,将相邻的数据合并起来排序,共有n/2个组。然后将分组单位增加为2,与相邻数据进行排序。直到整个排序好。归并排序的过程:归并排序的完整代码(非递归):#include<iostream>using namespace std;#include<malloc.h>void...

2019-08-23 21:21:36 191

原创 MySQL数据库---索引

(一)索引:当数据量小的时候,用不用索引,感觉没有什么很大的区别。但当数据量大时,索引就显得尤为重要。索引就是一种数据结构,这个数据结构就是【非平衡二叉树】也就是B树或者B+树。有时也会使用哈希桶作用索引的数据结构。然而主流的数据库都是把平衡树当做数据表默认索引。(二)索引的分类:聚簇索引和非聚簇索引聚集索引:表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于...

2019-08-23 10:41:57 248

原创 MySql数据库---存储引擎

(一)数据库数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。数据库管理系统数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管...

2019-08-21 13:12:17 207

原创 Linux---I/O复用系统调用select、poll和epoll

select系统调用用途:在一段指定时间内,监听用户感兴趣的文件描述符上的看可读、可写、异常等事件。select系统调用的原型:#include<sys/select.h>int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* t...

2019-08-16 22:14:43 174

原创 Linux---线程

(一)线程基础(1)线程的概念: 线程是进程内部的一条执行序列,或者执行流,每个进程至少有一条线程,称之为主线程,从代码角度可能,就是main函数的函数体,在主线程中可以通过线程库创建其他线程(函数线程)主线程和函数线程会同时向下运行。在线程模式下,一个进程至少有一个线程,但也可以有多个线程。当一个进程分解为多个线程,则可以让不同的线程同时运转在不同的处理器上,从而提高进程...

2019-08-14 19:24:26 115

原创 C++---单例模式

(一)单例模式简介: 单例模式(数学与逻辑学中,singleton定义为"有且仅有一个元素的集合"),是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,保证一个类仅有一个实例,并提供一个访问它的全局访问点。(二)为什么要用单例模式呢?在我们的系统中,有一些对象其实我们只需要一个,比如说:线程池、缓存、对话框、注册表、日志对...

2019-08-13 16:47:25 431

原创 C++---STL容器

STL六大组件:容器 迭代器 泛型算法 函数对象(仿函数) 接配器 空间适配器(一)STL容器分类序列式容器 :vector(向量容器) deque(双端队列容器) list(双向链表) 关联式容器 :set(单重集合) multiset(双重集合) map(单重映射表) multimap(多重映射表) 容器适配器 :stack(栈) queue(队列) p...

2019-08-12 20:39:58 210

原创 进程间通讯---共享内存

(一)共享存储允许两个或更多进程(可以不相关)共享一给定的存储区。共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到他们自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样。如果某个进程向共享内存写入数据,所做的改动将立即可以访问同一段共享内...

2019-08-11 16:44:04 145

原创 进程间通讯---信号量

一、信号量概念它是一个用来同步进程的特殊变量,一个特殊的计数器,只能对它进行等待和发送信号这两种操作。大于0时记录资源的数量,小于0时,记录等待资源的进程数量,最简单的信号量只能取值0和1的变量。即二进制信号量(二元信号量或双态信号量)。可以取多个正整数的信号量被称为通用信号量。信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源...

2019-08-10 13:59:35 644

原创 进程间通讯---消息队列

消息队列与命名管道有许多相似之处,但少了在打开和关闭管道方面的复杂性。使用消息队列并未解决我们在使用命名管道时遇到的一些问题,比如管道满是的阻塞问题。消息队列(队列)提供了在两个不相关的进程之间传递数据的相当简单 且有效的方法。与命名管道相比,消息队列的优势在于,它独立于发送和接收进程而存在,这消除了在同步命名管道的打开和关闭时可能产生一些困难。特点:消息队列是消息的链接表,具有特定的...

2019-08-10 12:40:35 144

原创 C++---智能指针

首先要知道智能指针是用来解决什么问题的,首先我们先看下面这段代码void Func(int *p){ int *sp = new int; if (p == NULL) { throw std::exception("p is NULL"); } delete sp;}这个函数有一个很大的问题,如果传入的参数p为空,遇到 if 语句就命中之后就会抛出异常,程序中断。那么...

2019-08-10 11:13:47 194

原创 Linux---信号

(一)信号是系统为了响应某些条件而产生的一个事件。接收到该信号的进程会相应地采取一些行动。术语“生成”表示一个信号的产生,术语“捕获“”表示接收到一个信号。信号是由于某些错误条件而生成的,如内存段冲突、浮点处理器错误或非法指令等。它们由shell和终端处理器生成引起中断,它们还可以作为在进程间传递消息或修改行为的一种方式,明确地由一个进程发送给另一个进程。信号可以被生成、捕获、响应或(至少对于一些...

2019-08-08 18:15:30 158

原创 C++---继承与多态2

1.虚函数首先,我们看一下当Base*指向Derive对象时,而Base类中含有虚函数时,基类和派生类大小、基类和派生类指针(引用)的类型。#include <iostream>#include <typeinfo>using namespace std; class Base{public: Base(int a = 1) { ma = a...

2019-08-08 16:48:13 213

原创 C++---继承和多态1

1.继承 本质:代码复用#include<iostream>using namespace std;class A{ public: A(a):ma(a){} private: int ma;}class B: public A{ public: B(b):mb(b){}...

2019-08-08 12:04:21 123

原创 C++---内存池

new:为对象开辟内存,调用构造函数做初始化delete:调用析构函数释放对象的资源,释放空间系统提供了operator new和operator deletevoid* operator new(size_t size){ void* ptr = malloc(size); cout << "operator new: " << ptr <&lt...

2019-08-02 20:25:47 134

原创 进程管理4---进程替换

(一)fork函数创建子进程后,子进程往往要调用一种exec函数以执行了另一个程序。当程序调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为exec并不创建新进程,所以前后的进程ID并未改变,只是用一个全新的程序替换了当前程序的正文、数据、堆和栈段。#include<unistd.h>int execl (const char *...

2019-08-01 14:40:23 147

原创 C++---模板

(一)函数模板(1)模板编译过程(在编译期间):在定义点只编译模板头部 在调用点编译模板函数template(关键字)<模板参数列表>template:定义模板类型参数,指明模板中的类型template<typename T>T Sum(T a , T b){ couture<<typeid(T).name<<end...

2019-07-31 13:41:18 245

原创 Linux---进程的状态转换

1.进程的三态模型在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。(1)运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。(2)就绪:当一个进程获得了...

2019-07-29 19:37:31 365

原创 进程管理5---进程终结

(一)进程的五种正常终止方式有:在main函数执行return语句。(等效于调用exit) 调用exit函数。 调用_exit或_Exit函数。 进程的最后一个线程在其启动历程中执行返回语句。但是,该线程的返回值不会用作进程的返回值。当最后一个线程从其启动历程返回时,该进程一终止状态0返回。 进程的最后一个线程调用pthread_exit函数。三种异常终止方式如下:调用abort...

2019-07-29 18:57:05 546

原创 Linux---地址映射

(一)实地址模式和保护地址模式先了解几个概念:总线:是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。CPU位数: CPU计算能力 ,ALU一次性能计算最长的整数的字节数,即ALU宽度(ALU从寄存器得到数据,寄存器从数据总线得到数据),所以...

2019-07-29 10:33:57 507

原创 进程管理4---进程替换

(一)fork函数创建子进程后,子进程往往要调用一种exec函数以执行了另一个程序。当程序调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为exec并不创建新进程,所以前后的进程ID并未改变,只是用一个全新的程序替换了当前程序的正文、数据、堆和栈段。#include<unistd.h>int execl (const char *...

2019-07-28 16:01:22 133

原创 排序算法---快速排序

快速排序思想:(Quick Sort)是对冒泡排序的一种改进,基本思想是选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,从而使整个序列达到有序。下面是快速排序的一种实现方法:挖坑填数快速排序的部分过程图:快速排序的完整代码(递归):#include<iostream&...

2019-07-27 17:12:43 320

原创 排序算法---堆排序

堆的存储:一般用数组表示堆i 结点的父结点(i-1)/2,左右结点下标分别为2*i+1和2*i+2例如:基本思想:将待排序列构造成一个大顶堆或者小顶堆。 最大值就是对顶的根节点,将它移走将其数堆中的元素进行交换,此时末尾元素就是最大值。 然后将剩余的n-1个序列重新排序构成一个堆,就会得到n个元素中的最大值。 反复进行。注意:建堆的过程是从最后一个子树开始(高楼平地...

2019-07-27 17:09:46 217

原创 C++---this指针和四个默认函数

(一)this指针下面是一个简单的商品类#include<iostream>using namespace std;#pragma warning (disable:4996)class CGoods{public: CGoods(char *name, float price, int amount) { cout << "CGoods::C...

2019-07-27 14:54:15 558

原创 排序算法---希尔排序

希尔排序的思想:又称为缩小增量排序,将待排序列的数据元素分成若干个小组,对于同一个小组内进行直接插入排序。增量逐渐缩小,当增量为1时。排序完成。例如:代码:void Shell(int arr[], int len, int width)//与直接插入排序类似{ int i = width; int j ; for (; i < len; i++) { ...

2019-07-26 17:34:19 91

原创 排序算法---直接插入排序

直接插入排序的基本思想:顺序的将待排序的数据按照关键字值的大小插入的已排序数据元素的集合中适当的位置,集合最初只有一个元素,当该集合元素个数和与原来数据个数相同,那么排序就完成了。例如:代码:#include<iostream>using namespace std;void insert_sort(int arr[], int len){ int i; i...

2019-07-26 16:01:51 133

原创 C和C++区别6---函数默认值

(一) C语言中,函数的参数是不能带默认值的。int sum(int a,int b = 10);这样是错误的。 但是在C++中上述的声明是允许的#include<iostream>using namespace std;int sum(int a,int b = 10){ return a + b;}int main(){ int ...

2019-07-26 15:13:16 590

原创 排序算法---交换排序

交换排序:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。比较的规则:就是把一个数字,依次的往后比较,遇到比它小的就进行交换。这是第一趟比较,所以第一趟比较完了之后,最小的就在第一个,其他几次比较都类似。例如:#include<stdio.h>void ...

2019-07-25 17:32:16 328

原创 排序算法---冒泡排序

冒泡排序原理:就是像是水泡从池底网上冒或者是一个石块往下沉的情况类似。相邻元素之间两两比较,大的往后放,第一次完毕之后,最大值就被找到。例如:排序的规则是:从头开始,如果前面的数比后面的数大,则交换,否则指针想后移。未优化:#include<stdio.h>void swap(int &a,int &b){ int c = a; a =...

2019-07-25 17:07:59 107

原创 进程管理3---进程创建

许多操作系统都提供了产生(spawn)进程的机制,首先在新的地址空间里创建进程,读入可执行文件,最后开始执行。Unix采用了与众不同的实现方式,它把上述步骤分解到两个单独的函数中去执行:fork()和exec()。fork通过拷贝当前进程创建一个子进程。子进程与父进程区别仅仅在于PID、PPID和某些资源和统计量(例如挂起的信号没有必要被继承)。 exec()函数负责读取可执行文件并将其...

2019-07-25 15:01:39 231

原创 进程管理2---进程描述符及任务结构

(一)进程描述符及任务结构内核把进程的列表存放在叫任务队列的双向循环链表中。链表中的每一项都是task_struct(进程描述符或进程控制块)每个进程在内核中都有一个进程控制块(PCB)存放进程的管理和控制信息,在32位机器上他大约有1.7KB。 task_struct包含以下内容:(1)PID:又称进程标识符,每个进程都会被分配一个唯一的数字编号,用来区别其他进程,ID为...

2019-07-25 00:05:01 320

原创 进程管理1---进程

进程和程序的区别进程:目前可以把进程看做是正在运行的程序。程序:存储在磁盘上的二进制可执行文件源代码——》编译——》连接——》ELF格式文.out/.exe——》执行(windows双击Linux./xx.out)——》进程操作系统如何表示一个进程?在虚拟目录/proc(以进程为单位存储内存的映射),可以窥视正在运行的进程的内部情况,好像进程是目录中的文件一样。什么是进程...

2019-07-24 17:18:54 79

原创 C和C++区别5---inline函数

(一)inline函数又称为内联函数,若一个函数被指定为 inline 函数 则它将在程序编译阶段,在每个调用点上被内联地展开 。在函数声明或定义中的函数返回类型前加上关键字inline,即把函数指定为inline。(二)inline函数和static修饰的函数的区别 1.inline 无开栈清栈开销 static 有2.inline 编译阶段调用点代码展...

2019-07-24 15:29:49 364

原创 C和C++区别4---引用

(一)引用(1)引用传入表层:给内存块起的别名int a = 10;int &b = a;底层:C++中和指针的处理方式相同,即在用到引用的地方,就会自动进行解引用。相当于下面这段代码int a = 10;int *b = &a;(2)特点引用必须初始化int a = 10;int &b ;//错误...

2019-07-24 14:39:40 262

空空如也

空空如也

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

TA关注的人

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