自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 静态链接和动态链接

静态链接要解决的事情现代的大型软件动辄几百万行的代码,如果我们把所有的代码放在同一个main.c文件中,我想在后期寻找bug和维护的时候,一定是一个头疼的事情。最常用的结局方法便是使用不同的模块来完成一个功能,然后把这些模块拼接起来,组成一个完整的应用程序。所以,静态链接就是用来解决不同模块之间的通信问题:1.不同模块之间的函数调用;2.不同模块之间的函数调用;一个复杂的软件就是把全部分成一个小系统来进行处理,把每个模块的源代码进行独立的编译,然后通过静态链接组装起来,链接就是整个组装模块的过程,链

2021-07-30 20:53:04 461

原创 Linux内存管理

虚拟内存和物理内存物理内存就是内存块的物理地址集合,来访问已经位置固定的内存区域。虚拟内存是为了解决物理内存地址暴露给进程的一种机制,通过虚拟内存映射来访问物理内存,从而达到保护物理内存的安全以及提高访问内存的效率。虚拟内存支持程序访问比物理内存大得多的内存空间,这个功能依靠磁盘+RAM来实现,因为磁盘空间相对于RAM来说价格更低廉,存储空间大,所以虚拟内存并不是真正意义的内存,而是一种虚拟的映射关系。页,页框,页面虚拟内存块通常被分割成页,页的大小通常在32位的系统下被分成4KB,页是内存管理的基本

2021-07-30 20:46:01 209

原创 C++智能指针简单剖析

智能指针的意义在C++中,new和delete申请和销毁堆内存的关键字,而程序员在进行堆内存申请之后,常常容易忘记delete释放堆内存,而这也就容易造成一种现象–内存泄漏,也就是一块堆内存被申请之后,没有被释放,导致其他程序也不能使用这块堆内存,从而造成堆内存的浪费,降低了c++的开发效率。在java等语言中,只有new的关键字,而没有delete关键字,这就是因为java语言内存回收机制,而由于之前C++对于代码运行效率的极度追求,所以也没有引入这种机制。但是。随着C11标准等的发布,智能指针逐渐被大

2021-07-30 20:37:44 231

原创 并查集的实现和优化以及使用

并查集的代码实现并查集主要由三部分接口函数构成,分别是findhead(),union_set()和Is_sameset()构成。findhead主要是用来寻找同集合中的头集合,union_set主要是用来合并两个集合,is_Sameset主要是判断两个数据是否是同一个集合。unionset的构造class UnionFindSet { vector<int> parent; // 用来存放它的上层节点 vector<int> rank; // 存放根节点的尺寸

2021-07-30 14:41:48 194

原创 LeetCode 1114 按序打印

需求在多线程环境下按序打印firstsecondthird,并且保证打印顺序不会出错使用信号量#include<semaphore.h>class Foo { sem_t sem1; sem_t sem2;public: Foo(){ //sem_init 初始化信号量 //对信号量进行初始化; sem_init(&sem1,0,0);sem_init(&sem2,0,0); } void

2021-06-16 11:46:52 171

原创 C++实现一个简单的Hashtable

哈希函数哈希函数用于将一个大数(手机号码)或字符串映射为一个可以作为哈希表索引的较小整数的函数。也就是,对一个输入stdin可以转换成另外一个索引比较小的stdout。用公式表达就是stdout=H(stdin)。采用哈希函数可以进行加密等操作。当前的比特币挖矿的原理就是每一个比特币都是通过哈希函数加过密的,所以我们只有不断的去尝试加密后的数字,来得到加密前的币。一个好的哈希函数应该满足以下几个条件:1. 执行效率要高(效率高,对于一段很长的字符串或者二进制文本也能快速计算出哈希值。2. 散列结果应

2021-05-22 16:41:38 489

原创 C++11--右值引用

右值引用的语法定义传统的C++引用(&)使得标识符关联到左值。传统的作指示一个表达式,程序可以获取变量的地址,然后申请一个空间。而C++11的新标准中新增了右值引用 ,使用&&来表示。左值的英文简称是lvalue,右值的英文简称是rvalue,这并不是left value 和right value的简称,而分别是locator value的缩写,意思是在内存中可明确寻址的的数据。 而rvalue指的是read value,也就是那些可以提供数据值的数据。简单来讲,可以通过两种方

2021-04-08 18:49:18 193

原创 两种高效的服务器并发模式

高并发的目的就是提高CPU的使用率,使得程序可以“同时”执行多个任务。一旦程序中发生阻塞,则其他程序能立即执行,不会阻塞从而降低CPU的使用率。不过对于计算密集型的程序,高并发编程反而没有优势,因为任务的切换降低了效率。但是如果是I/O密集型,经常读写文件、访问数据库等等,I/O操作的熟读远没有CPU计算速度快,所以会显著降低了CPU的执行效率。并发模式指的是I/O处理单元和多个逻辑单元协调完成任务的方法。有两种方法:半同步/半异步模式 和 领导者/追随者 模式。半同步/半异步模式这里的同步指的是程

2021-03-31 16:28:12 260

原创 TCP/IP三次握手四次挥手过程

TCP报文的头部结构TCP头部信息出现在TCP报文段中,目的是指定源端端口、目的端端口、管理TCP链接等等。TCP的头部结构如图所示:其中16位端口号就是指定通信端口的,分别指定源端口号和目的端口号。而32位的序号也就是SEQ来表示每次传输方向里字节流中每个字节的编号。通常这个值是某一个随机值。32位的确认号ACK是用来对发送来的TCP报文段进行响应。通常ACK=SEQ+1。4位的头部信息用来标识TCP报文信息。6个标志位中,ACK,RST,SYN,FIN此四个最常用,分别表示确认号是否有效,让对方从

2021-03-31 14:30:55 121

原创 C++设计模式之《单例模式》

饿汉模式饿汉模式也就是进入主函数之前就创建对象,此时线程安全。类外实例化–》所以是线程安全;无论是指针还是引用,都是同一个对象,所以线程安全;//饿汉模式 --》主函数一运行就创建实例化对象class Singleton{private: int value; Singleton(int x = 0) :value(x) { } Singleton(const Singleton&) = delete; Singleton& operator=(const Si

2021-03-30 21:29:29 94

原创 抽象工厂模式

标题class Log{public: virtual void writeLog() = 0; //纯虚函数,抽象类, virtual ~Log() {}};class database :public Log{public: database() {} ~database() {} void writeLog() { cout << "Write Database Log!" << endl; }};class fileLog :pub

2021-03-30 18:45:58 97

原创 C++设计模式之简单工厂模式

工厂模式的定义工厂模式主要有如下两个功能:创建对象的接口,分装在了对象的创建之中。具体化类的工作延迟到了子类中。也就是说,工厂模式可以实现对类对象的生产,而类对象的生产是通过工厂方法来实现的,而不能用户自己创建。而且工厂可以根据用户实际需求,来生产所需要的对象。根据示意图,工厂Factory中实现了方法CreateProduct()来进行产品的生产,而对于不同的产品需求,多态实现不同的产品生产,而保留了产品的生产权利只在工厂之中,使得产品的安全性更高。简单工厂模式代码实例struct S

2021-03-30 17:36:18 197

原创 linux储存管理

linux系统使用的是地址空间的概念来管理内存数据。如果把物理地址暴露给进程会带来几个问题:1.非法程序可能会破坏操作系统。2.很难实现并发。所以引入了地址空间的概念:地址空间是一个进程可用于寻址内存的一套地址集合。简单来说,地址空间为进程创造了一种抽象的内存。每个进程都有自己的地址空间,并且这个地址空间独立于其他进程的寻址空间。要保证多个应用程序同时处于内存中并且互相不影响,需要解决两个问题:保护和重定位。解决内存超载有两种处理内存超载的方法:1.最简单的测略就是交换技术:一个进程先在内存

2021-03-26 10:50:55 118

原创 C++实现排序算法

快速排序 int partition(vector<int>& arr,int left,int right) { int tmp=arr[left]; while(left<right) { //先从右面开始 while(left< right&&arr[right]>=tmp) { r

2021-03-23 12:44:23 107

原创 memcpy的实现

void* memcpy(void* dest,const void* src,int len){ if(dest==NULL || src==NULL) return NULL; char* d; const char* s; if(dest>src+len || dest<src) { d=dest; s=src; //不会发生覆盖 while(len--) { *p++=*s++; } }else{ //可能发生覆盖,从后往前拷贝

2021-03-21 11:08:14 91

原创 LeetCode104求二叉树的最大深度

非递归代码:class Solution {public: int maxDepth(TreeNode* root) { int depth=0; queue<TreeNode*> que; if(root!=NULL) que.push(root); while(!que.empty()) { int size=que.size(); for(int i=

2021-03-20 14:03:25 78

原创 剑指offer 54 二叉树的深度

使用DFS思想解决 int maxDepth(TreeNode* root) { //DFS深度遍历 if(root==NULL) return 0; int left=maxDepth(root->left); int right=maxDepth(root->right); //找到 return (left>right)?left+1:right+1;

2021-03-20 14:02:35 114

原创 C++STL系列--1.顺序容器vector,list,deque

容器的定义容器,置物置所也。容器通俗来讲就是一种数据结构。STL提供了一组顺序容器:vector,list,deque,stack,queue,priority_queue;其中stack和queue只是deque改头换面而成,内部的数据结构还是deque。vector容器vector的数据和array非常相似。但是array是静态空间,一旦配置就不能改变;需要扩容的时候需要手动扩容,非常麻烦;而vector是动态空间,随着元素的加入,内部机制会自动扩容空间容纳新元素。vector采用的数据结构

2021-03-07 12:43:28 217

原创 二叉树的四种遍历

二叉树节点生成 struct BTnode{ BTnode* left; BTnode* right; Elemtype data;};中序遍历遍历顺序是左根右; void InOrder(BTnode* root) { if (root != NULL) { InOrder(root->left); cout << root->data << " "; InOrder(root->right); } }

2021-03-05 20:19:56 106

原创 c++编译链接阶段的目标文件相关

目标文件的格式目标文件是编译器编译了源代码之后生成的文件格式(.O)。目标文件从结构上来说,是已经编译好之后的可执行文件格式,还未经过链接,其中可能有些地址和符号还未调整。所以说,目标文件和可执行文件的内容和结构很相似,通常在Linux系统下采用ELF格式来存储。 此外,值得注意的是,不光可执行文件按照可执行文件格式存储,动态链接库(DLL)和静态链接库(Static Linking Library)都按照可执行文件格式存储。目标文件的结构目标文件中存储了编译后的机器指令代码、数据、符号表、调试信息

2020-12-07 17:07:28 411 1

原创 三种线程同步机制----信号量、互斥量、条件变量

跟多进程一样,多线程程序也得考虑同步的问题。信号量常见的信号量函数有以下五个:sem_init函数用来初始化 一个未命名的信号量。pshard如果是0,则只能在当前线程使用,否则可以在多线程之间共享。value制定信号量的初始值。sem_destroy用来销毁信号量,以释放占用的内核资源。sem_wait函数以原子操作将信号量的值减1.如果减为0,则sem_wait会被阻塞住,直到非0.sem_trywait是非阻塞版本,不管value是不是0,都会立即返回。非0时,则会执行value减一操作。

2020-12-07 15:38:50 449

原创 TCP/HTTP链接过程解析

HTTP链接过程如果我们在浏览器输入了www.baidu.com的网址,在网络链接正常的情况下,浏览器则会进入到百度的首页,呈现给我们。或许我们都知道使用,却不知道底层是先有以下几个步骤完成:浏览器分析直接指向的URL;DNS域名解析IP地址;浏览器和服务器三次握手建立链接;浏览器发送请求报文段;服务器解析请求报文段;服务器回复请求报文段,其中包含请求信息以及html文件;释放TCP断开连接;解析报文段,呈现在浏览器中;以上8个步骤完成,才是一次真正的网址访问的完成。DNS域名解析

2020-11-26 12:33:18 681

原创 僵死进程

僵死进程的概念一个已经终止、但是其父进程尚未获取到终止紫禁城的有关信息、释放子进程占用的资源的进程被称之为僵死进程,简单来讲,子进程结束了,但是父进程尚未读取其退出状态,该子进程处于僵死态。 当父进程结束或者异常终止的时候,子进程尚未结束,此时子进程被init进程接管,init为此子进程的父进程,等待子进程结束。在父进程推出之后,子进程退出之前,此子进程处于僵死态。wait及waitpid函数处理僵死进程每当一个子进程结束的时候,则父进程调用wait或者waitpid来获取子进程的终止状态。父进程也

2020-11-15 12:13:52 169

原创 简单理解fork

fork的函数原型一个现存进程调用fork函数是UNIX内核创建一个新进程的唯一方法。通过fork创建的新进程被称作为子进程。 fork函数被调用一次,但是返回两次。其中子进程的返回值是0,而父进程的返回值则是新创建的子进程的进程PID。 将子进程的pid作为父进程的返回值的原因是:一个进程的子进程有多个,没有一个函数使一个进程可以获得所有的子进程的pid。fork之后子进程的fork函数返回值是0的原因:一个进程智能有一个父进程,所以子进程总是可以调用getpid来获取父进程的进程id,所以子进程的

2020-11-15 10:54:26 1853

原创 详解多态的实现机制

多态的三种表现形式多态: 就是多种形态,在完成某个行为时,不同对象完成会产生不同的结果。在函数内部的表现形式便是同一个函数的接口,但是出现的不同的结果。多态一共有三种形式:1.静多态,就是在编译阶段确定函数的调用;2.动多态,在运行阶段才会确定函数的调用。3.宏多态,在预编译阶段就确定了函数的调用。而在默认状态下,一般默认都是动多态。而实现动多态,在需要虚函数来提供支持;多态的实现机制因为静多态只有在运行阶段才会确定函数的调用,所以我们需要在运行阶段获取到函数的入口地址才能实现多态。但是在程

2020-11-02 16:30:10 1264

原创 进程间通信

进程间通信的方式进程间通信 IPC(Inter-process communication)。在操作系统中,每一个进程都是独立的执行体。但是在有些时候,进程之间又需要相互交互,所以就有了进程间通讯,Linux下进程间的通讯方式有: 信号、管道(有名、无名)、信号量、消息队列、共享内存、socket等。信号当我们使用了多线程来编写代码的时候,程序中总是存在一部分临界代码,我们需要确保只有一个进程或者执行线程可以进入这个临界代码并且对这块资源拥有独占式的访问权。临界资源:同一个时刻只允许一个进程或者执行

2020-11-01 16:40:21 127

原创 基本TCP套接口的编程流程

基本编程流程概述要实现客户端和服务器端的通信,则需要客户端和服务器端共同完成。其中,TCP服务器和客户端的编程流程如图所示:首先由服务器端创建socket,然后bind绑定通信端口,创建listen监听队列。之后便开始了通讯的过程。此时服务器阻塞在accept这里,直到tcp客户端主动进行connect进行三次握手建立连接。此时客户端的write函数向服务器发送请求,服务器端read来读取请求,并且进行处理。处理完成之后调用服务器端的write函数给客户端发送应答报文,客户端则通过read来接受回应信息

2020-11-01 13:27:31 747

原创 理解LInux系统下的五种IO模型

五种IO模型对服务器进行编程的过程中,一个t套接口的输入操作一般有两个不同的阶段:等待数据准备好从内核到进程拷贝数据简而言之,对于一个套接口的输入操作,第一步是等待数据到达内核中的一个缓冲区中,例如在对屏幕进行打印的时候,首先是先把数据保存到标准输出缓冲区中,然后刷新输出缓冲区,即可完整打印出来内容。第二部是将数据从内核缓冲区拷贝到应用缓冲区中。针对这个过程,linux一共提供了五种IO模型来应对不同的需求:阻塞性IO非阻塞IOI/O复用信号驱动异步IO

2020-11-01 11:41:57 123

原创 力扣 101 对称二叉树

题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ /2 2/ / / /3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:思路解析:对于一颗二叉树来判断此树是不是对称,不是比较左右两个孩子节点,而是比较左右两个子树是否是镜像。举个例子,左子树的根节点的左孩子节点要和右子树的根节点的右孩子的值要相等。保证这,即可完成判断。递归法 bool mirro

2020-10-29 20:51:54 88

原创 LeetCode --翻转二叉树

题目描述:翻转一棵二叉树。示例:输入:4/ /2 7/ / / /1 3 6 9输出:4/ /7 2/ / / /9 6 3 1思路分析:要想交换一个二叉树,只需要在遍历每个节点的时候,交换其左右两个孩子的位置,即可完成对整颗二叉树的逆置。注意,此题不可以使用中序遍历来的反转二叉树。递归法:通过先序遍历每个节点,然后交换左右两个孩子,来实现对整个二叉树的翻转。代码: TreeNode* invertTree

2020-10-29 20:02:47 318

原创 LeetCode---二叉树的广度优先遍历相关

广度优先遍历直白一点,广度优先遍历指的是按照二叉树层级的思想,从左到右一层一层的遍历;首先,完成这种遍历思想需要借助一个辅助的数据结构队列来完成;队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。上例题:LeetCode102题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],返回其层次遍历结果:[[3],[9,20], [15,7]

2020-10-29 19:45:19 214

原创 C++基础----const关键字相关

const在c++中 **在C++中,const限定符就是把一个对象转换成一个常量**。但是,常量的定义就是不能被修改,所以在c++的源文件中,const修饰的符号必须被初始化。const int a=10;此段程序在C++中是合法的。而对于c语言中来说,对于一个常量,则不必初始化则可以编译通过。const int a;const在c++中的用法:1.const修饰的变量一定要初始化;2.在c++中,const修饰的变量不允许修改;3.无论是对const修饰的内存块是进行间接访问还是

2020-05-29 11:52:17 168

原创 字符串相关知识

字符串定义字符串就是一个或者多个字符,并且以一个\0结尾的数据集合。值得注意的是,结尾的*\0*并不属于这个字符串,所以它并不属于字符串长度的一部分。字符串的长度 strlen库函数strlen的源代码如下:#include<stddef.h>size_t strlen(char const *string){ int length; for(length =0;*...

2020-04-22 18:12:11 131

原创 带头结点的单链表相关(1)

单链表常见习题(1)判断两个单链表是否相交,并且返回交点的节点思路分析判断两个单链表是否相交,有两种思路:1.对两个一直遍历到最后一个节点,判断最后一个节在这里插入代码片点地址是否相等 。如果两个链表最后一个节点的地址相等,则至少有一个链表结点是相互重合的。但是这种方法不能确定交点,只能去确定是否有交点。2.对于两个链表,可以用一种对齐的方法然后再逐项对比。一直遇到相等的一个链表结点,即...

2020-04-21 21:12:56 168

原创 c语言之内存对齐

结构体在学习结构体的时候,老师留下了一个很有意思的问题:

2019-11-13 10:49:16 218

原创 c语言基础----数据

数据的表现形式在计算机高级语言中,数据有两种表现形式:常量和变量。C语言是一种重类型的语言,它不像python等弱类型语言,在定义变量的时候不需要强调变量的类型,而是根据开发者定义的形式来自动判断变量的类型。c和c++在定义变量的时候,必须要将变量的两个要素定义完整,则整个程序编译的时候才能编译通过。其形式如下: 变量类型 变量名 ,只有两个要素都符合,一个变量的定义才算完成。变...

2019-11-09 18:18:34 206

原创 关于程序编译的四个阶段的再次解读

程序编译的4个过程(记录贴,学渣学习两月半c++练习生第一次blog,若有错误请提出)在使用编译器编译一段程序时,当我们编辑完成之后,只需要点击编译键,则编译器则会返回对这段程序的编译结果,如果错误则返回错误的地方以及错误提示,方便我们对此处的程序进行修改,而使程序可以完成编译。但是我们是否曾纠结过编译器在编译的时候是一个什么样的过程。我们只知道此段程序,函数在编译的时候一共分为四个阶段: ...

2019-11-07 20:58:42 854

空空如也

空空如也

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

TA关注的人

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