自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 IIC通信

IIC协议简介IIC通信协议是由Phiilps公司开发,引脚少,硬件实现简单,扩展性强,多用于板内通讯。对于IIC通讯协议,可以以分层的方式理解,可以分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保数据在物理媒体中的传输。协议层主要规定通讯逻辑,同一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是肢体来交流,协议层规定我们用中文还是英文来交流。IIC物理层IIC通讯设备之间的常用连接方式如下图所示:...

2022-04-01 13:27:45 1577

原创 操作系统---内存管理

我们程序所使用的内存地址叫做虚拟内存地址; 实际存在硬件里面的空间地址叫做虚拟内存地址; 操作系统引入了虚拟内存,进程持有的虚拟地址会通过CPU芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后通过物理地址访问内存; 操作系统管理虚拟地址与物理地址:内存分段和内存分页; 内存分段:程序由若干个逻辑分段组成的,如可由代码段、数据段、栈、堆等,不同的段有不同的属性,所以就用分段的形式把这些段分离出来; 分段机制下,虚拟地址和物理地址通过段选择因子和段内偏移量来映射; 内存分段所带来的

2021-09-21 16:46:13 288

原创 计算机网络---面经总结一(本人校招面试中,持续更新......)

1、为什么三次握手,而不是两次?首要原因,防止旧连接初始化我们新的连接; 其次,三次握手可以同步双方的序列号; 最后,三次握手可以确认双方的接收和发送能力都正常;2、

2021-09-15 22:02:06 315

原创 C++---面经总结三(本人校招面试中,持续更新......)

1、C++移动构造函数?我们用对象a初始化对象b,然后对象a就不再使用了,但是对象a的空间还在(在析构之前),既然调用拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为什么不直接使用a的空间?这样就避免了新的空间的分配,大大降低了构造的成本,这就是移动构造函数设计的初衷; 默认的拷贝构造函数,实际上就是一种浅拷贝,如果说类对象不占用外部资源(堆资源),那么这种浅拷贝是没有啥问题的;但如果对象占有外部资源,也就是存在指针成员指向堆内资源,那么这种浅拷贝就要发生问题了,因为此时两个指针指向堆内同

2021-09-11 12:44:20 196

原创 C++---面经总结二(本人校招面试中,持续更新......)

1、main函数之前执行和之后执行的代码可能有哪些?main函数之前:设置栈指针,开辟main函数栈帧,main函数有参数的话进行参数压栈; 初始化静态变量和全局变量,也就是 .data 段内容; 将未初始化的全局变量进行初始化为0(其中bool型为false),也就是 .bss 段内容; 全局对象的初始化,在main函数之前调用构造函数;main函数之后:全局对象的析构函数会在main函数之后执行; 由atexit注册的函数,会在main函数执行之后执行;可以多次调用注册多个,但执行

2021-08-31 22:46:39 289

原创 C++---面经总结一(本人校招面试中,持续更新......)

C++this指针是干什么用的?一个类定义了很多对象,对于每个对象它们有自己的成员数据,但是它们共享一套成员方法,那么在成员方法里面是如何区分是哪个对象调用该方法,那就是通过this指针。C++普通的成员方法被编译之后都会多出来一个this指针参数,用来接收调用该方法的对象的地址。C++的new和delete,什么时候用new[ ]申请,可以用delete释放?引申以下:malloc和new的区别? malloc是按字节开辟内存的;new开辟内存时需要指定类型newint[10],..

2021-08-24 01:34:47 860

原创 数据结构---替换空格

问题描述:请实现一个函数,把字符串s中的每个空格替换成"%20"。输入:s = "We are happy."输出:"We%20are%20happy."知识点: string中的 reserve() 和 resize()的区别reserve()为容器预留足够的空间,避免不必要的重复分配。预留空间大于等于字符串的长度。 resize()调整字符串的大小。如果字符串长度变小,多余的字符会被截掉。若长度变大,可以设置填充的字符。代码实现:class S...

2021-08-21 22:36:08 128

原创 数据结构---第一个只出现一次的字符

题目描述:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。思路:创建 vector 记录遍历字符串 s 的顺序,同时创建一个map或者unordered_map记录每个字符出现的次数,pair<char,int>; 遍历s,在map中查找,若无则插入map中,同时push_back到vector中;若有则令该字符所对应的value值++; 按照vector中的字符顺序,查找第一个value为1的字符并输出;代码:class So

2021-08-20 12:07:27 143

原创 数据结构---两个栈实现队列

问题描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )。代码实现:#include<iostream>#include<stack>using namespace std;class CQueue {public: CQueue() { while(.

2021-08-17 11:02:39 103

原创 C++ --- 继承结构下类对象的内存布局

目录virtual应用场景:普通继承(不含虚函数)普通继承(含虚函数)虚继承(不含虚函数)虚继承(含虚函数)首先,明确几个概念:抽象类:含有纯虚函数的类叫做抽象类,抽象类不能实例化对象,但是可以定义指针或者引用变量,在实际开发中,我们一般把基类设计成抽象类;虚基类:被虚继承的类叫做虚基类,也就是在继承方式前添加了virtual关键字;virtual应用场景:修饰成员方法,表明该方法是虚函数,含有虚函数的类会自动添加一个虚函数指针(vfptr)成员数据,vfptr指向虚

2021-08-14 19:05:11 499

原创 C++ --- 虚函数与动态绑定

首先抛出问题: 是不是虚函数的调用一定就是动态绑定? ( 肯定不是) 在类的构造函数中,调用虚函数,也是静态绑定(构造函数中调用其它任何函数,都不会发生动态绑定)。也就是说在有对象之前是不能发生动态绑定的,构造函数执行完才能生成对象;其次,如果不是通过指针或者引用变量来调用虚函数,而是通过对象来调,那就是静态绑定。示例代码:#include<iostream>using namespace std;/* 虚函数与动态绑定 问题:是不是虚函数的调用

2021-08-14 12:24:41 989

原创 C++ --- 虚析构函数

首先抛出几个问题: 哪些函数不能实现成虚函数?(构造函数和静态的成员方法) 构造函数不能是虚函数,析构函数可以是虚函数,为什么? 什么时候把基类的析构函数必须实现成虚函数? 虚函数的依赖虚函数能产生地址,存储在vftable中; 对象必须存在(vfptr -> vftable -> 虚函数地址) 所以: 构造函数不能是虚函数,先执行构造函数才能产生对象,然后才能找到虚函数表,反过来都找不到构造函数; 构造函数中调用任何函数,都是静态绑...

2021-08-14 12:20:01 350

原创 C++ --- 虚函数、静态绑定、动态绑定

首先明确一个在类继承结构中出现的名词:覆盖覆盖:如果派生类中的方法,和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是virtual虚函数,那么派生类的这个方法,自动处理成虚函数,它们之间成为覆盖关系;也就是说派生类会在自己虚函数表中将从基类继承来的虚函数进行替换,替换成派生类自己的。静态绑定:编译时期的多态,通过函数的重载以及模板来实现,也就是说调用函数的地址在编译时期我们就可以确定,在汇编代码层次,呈现的就是 call 函数名;动态绑定:运行时期的多态,通过派...

2021-08-14 12:09:18 295

原创 C++ ---重载、覆盖、隐藏

1.重载关系:一组函数要重载,必须处在同一个作用域,而且函数名相同,参数列表不同.#1与#2就是重载关系2.隐藏关系:(作用域的隐藏)在继承结构中,派生类的同名成员函数,把基类的同名成员函数(非虚函数)给隐藏掉了 #1和#3#2和#3都是隐藏关系如果想调用基类同名成员函数,就得添加基类作用域Base::3.覆盖关系:虚函数表中虚函数地址的覆盖;如果...

2021-08-14 11:53:27 157

原创 C++ --- 派生类的构造过程

目录派生类怎么初始化从基类继承来的成员变量?派生类对象构造和析构的过程示例代码首先,派生类从基类可以继承来所有的成员(成员变量和成员方法)。派生类怎么初始化从基类继承来的成员变量?解答:通过调用基类相应的构造函数来初始化派生类的构造函数和析构函数,负责初始化和清理派生类部分; 派生类从基类继承来的成员的初始化和清理由基类的构造函数和析构函数来负责。派生类对象构造和析构的过程: 派生类调用基类的构造函数,初始化从基类继承来的成员; 派生类调用自己...

2021-08-12 14:06:44 662

原创 C++ --- 继承的本质和原理

类继承的本质代码复用 实现多态的基础类之间的关系组合:a part of... 一部分的关系 继承:a kind of... 一种的关系继承方式继承方式 基类的访问限定 派生类的访问限定 外部访问限定 public public public YES protected protected NO private 不可见 NO protected .

2021-08-12 13:58:14 651

原创 C++-理解函数模板

相关知识点:函数模板:它是模板,不进行编译(因为类型不知道),在模板的调用点根据用户指定的参数类型,进行实例化生成模板函数,再参与编译; 模板的实例化:函数调用点进行实例化; 模板函数:才是要被编译器所编译的; 模板的实参推演:可以根据用户传入的实参的类型,来推导出模板类型参数的具体类型; 模板的特例化:特殊(不是编译器提供的,而是用户提供的)的实例化; 模板代码是不能在一个文件中定义,在另一个文件中使用的; 模板代码调用之前,一定要看到模板定义的地方,这样的话,模板才能够进行...

2021-08-10 18:05:25 93

原创 C++设计模式---代理模式

设计模式概念简单来说,设计模式就是在解决某一类问题时,有既定的优秀的代码框架可以用,优点如下:代码易于维护; 能够做到软件设计的开-闭原则(对修改关闭,对扩展开放); 合理的设计模式,能够做到软件设计的高内聚,低耦合。代理模式的作用代理模式也称为委托模式,作用就是找一个对象来替我们访问某个对象意图:为其它对象提供一种代理以控制...

2021-08-10 18:00:24 201

原创 C++智能指针

在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。...

2021-08-09 18:40:48 667

原创 C++设计模式---工厂模式

设计模式概念简单来说,设计模式就是在解决某一类问题时,有既定的优秀的代码框架可以用,优点如下:代码易于维护; 能够做到软件设计的开-闭原则(对修改关闭,对扩展开放); 合理的设计模式,能够做到软件设计的高内聚,低耦合。工厂模式分类简单工厂 Simple Factory 工厂方法 Factory Method 抽象工厂 Abstract Factory针对以上三种模式,先给出结论如下:简单工厂不符合软件设计的开-闭原则,由此改进产生工厂方法 工...

2021-08-09 14:39:01 348

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

目录为什么需要设计模式什么是单例模式?饿汉式:线程安全的懒汉式单例模式方法1:线程安全的懒汉式单例模式方法2:为什么需要设计模式简单来说,设计模式就是在解决某一类问题时,有既定的优秀的代码框架可以用,优点如下:代码易于维护; 能够做到软件设计的开-闭原则(对修改关闭,对扩展开放); 合理的设计模式,能够做到软件设计的高内聚,低耦合。什么是单例模式?单例模式指的是,你无论怎么获取,永远只能得到该类的一个实例对象,所以单例模式的设计有如下三步曲:构造函数私有化,

2021-08-09 14:04:53 136

原创 C++中的重载、重写、和隐藏的区别

1、重载(overload)重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否是虚函数无关。举个例子:...

2021-06-01 14:52:05 594

原创 构造函数和析构函数能否声明为虚函数或者纯虚函数

析构函数:析构函数可以为虚函数,并且一般情况下基类析构函数要定义为虚函数。只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。析构函数可以是纯虚函数,含有纯虚函数的类是抽象类,此时不能被实例化。但派生类中可以根据自身需求重新改写基类中的纯虚函数。...

2021-06-01 14:33:45 1767

原创 为什么基类析构函数一般写成虚函数

由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。所以将析构函数声明为虚函数是十分必要的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。..

2021-06-01 14:17:45 2787

原创 二叉树递归与迭代遍历

1、递归解法前序遍历中序遍历后续遍历2

2021-05-31 20:18:31 108

原创 final与override关键字

override当在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以:class A{virtual void foo();}class B : public A{void foo(); //OKvirtual void foo(); // OKvoid foo() override; //OK}...

2021-05-30 21:29:17 107

原创 C++中const和static的作用

static不考虑类的情况隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用考虑类的情况static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为

2021-05-30 21:17:34 228

原创 C++中struct和class的区别

相同点两者都拥有成员函数、公有和私有部分任何可以使用class完成的工作,同样可以使用struct完成不同点两者中如果不对成员不指定公私有,struct默认是公有的,class则默认是私有的class默认是private继承,而struct模式是public继承引申:C++和C的struct区别C语言中:struct是用户自定义数据类型(UDT);C++中struct是抽象数据类型(ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态)C中struct是没有权限的设置的

2021-05-30 21:02:59 386

原创 野指针和悬空指针

都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。野指针野指针,指的是没有被初始化过的指针

2021-05-30 20:51:13 278

原创 宏定义、函数、typedef

宏定义和函数有何区别宏在编译时完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数。宏定义属于在结构中插入代码,没有返回值;函数调用具有返回值。宏定义参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型。宏定义不要在最后加分号。宏定义和typedef区别...

2021-05-30 20:28:04 266

原创 new/delete与malloc/free

相同点:都可用于内存的动态申请和释放不同点:new/delete是C++运算符,malloc/free是C语言标准库函数

2021-05-30 20:14:30 135

原创 高速缓存(L1、L2、L3三级缓存)

1、高速缓存至关重要 刚开始,我们编译好的可执行程序是存放在磁盘上的,当程序加载时,它们被复制到主存,当处理器(CPU)运行程序时,指令又从主存复制到处理器。从程序员的角度来看,这些复制就是开销,减慢了程序“真正”的工作。因此,系统设计者的一个主要目标就是使这些复制操作尽可能快地完成。根据机械原理,较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价远高于同类的低速设备。比如说,一个典型系统上的磁盘驱动器可能比主存大1000 倍,但是对处理器而言,从磁盘驱动器上读取一个字的时间开销...

2021-05-30 15:05:36 9861 1

原创 计算机操作系统

系统的硬件组成:1、总线:通常总线被设计成传送定长的字节块,也就是字(word),也称机器字长,机器字长 4个字节(32位),8个字节(64位)。2、I/O设备:输入输出设备,包括鼠标、键盘、显示器、磁盘等等进程:进程是操作系统对一个正在运行的程序的一种抽象。...

2021-05-30 11:26:46 132

原创 多线程死锁的原因以及解决方法

当多个线程访问共享资源时,需要加锁,如果锁使用不当,就会造成死锁这种现象。线程死锁造成的后果:所有的线程都被阻塞,并且线程的阻塞是无法解开的(因为可以解锁的线程也阻塞了)。造成死锁的场景主要有如下几种:加锁之后忘记解锁 重复加锁,造成死锁 程序中有多个共享资源,因此有很多锁,随意加锁,dao'z...

2021-05-30 10:56:42 4945

原创 TCP状态转换、半关闭、端口复用

1、TCP状态转换在 TCP 进行三次握手,或者四次挥手的过程中,通信的服务器和客户端内部会发送状态上的变化,发生的状态变化在程序中是看不到的,这个状态的变化也不需要程序猿去维护,但是在某些情况下进行程序的调试会去查看相关的状态信息,先来看三次握手过程中的状态转换。作者: 苏丙榅链接: https://subingwen.cn/linux/tcp-status/来源: 爱编程的大丙著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。...

2021-05-29 21:22:28 1329 2

原创 C++ this 指针

引言:首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。注意:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型,————————————————版权声明:本文为CSDN博主「我是一名好学者」的

2021-05-28 15:41:36 98

原创 C++中 NULL 和 nullptr 区别

算是为了与C语言进行兼容而定义的一个问题吧NULL来自C语言,一般由宏定义实现,而 nullptr 则是C++11的新增关键字。在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0。编译器一般对其实际定义如下:#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif意思就是说当

2021-05-28 14:44:11 193

原创 HTTP服务动态内容--get post

在这篇博文中https://blog.csdn.net/JachinYang/article/details/117329769 我们讨论了有关HTTP的基础知识,也谈到了什么是服务静态内容和服务动态内容,如果我们停下来考虑一下,就会发现一些问题,例如,客户端如何将程序参数传递给服务器?服务器如何将这些参数传递给它所创建的子进程?服务器如何将子进程生成内容所需要的其他信息传递给子进程?子进程将他的输出发送到哪里?CGI:通用网关接口,解决上述问题。1、客户端如何将程序参数传递给服务器GET...

2021-05-27 19:31:14 292 1

原创 HTTP-Web服务器基础

目录1、Web基础2、Web内容3、HTTP事务4、HTTP请求5、HTTP响应6、演示例程1、Web基础HTTP:超文本传输协议,web客户端和服务器之间用于交互的一种应用级协议。一个web客户端(浏览器)打开一个到服务器的因特网连接,并且请求某些内容,服务器响应所请求的内容,然后关闭连接。浏览器读取这些内容,并且显示在屏幕上。HTML:超文本标记语言,它告诉浏览器如何显示服务器响应回来的内容。2、Web内容对于Web客户端与服务器而言,内容是一个与MIM.

2021-05-27 16:35:00 230

原创 三次握手 四次挥手

TCP 协议是一个安全的、面向连接的、流式传输协议,所谓的面向连接就是三次握手,对于程序猿来说只需要在客户端调用 connect() 函数,三次握手就自动进行了。先通过下图看一下 TCP 协议的格式,然后再介绍三次握手的具体流程。1、TCP协议介绍在 Tcp 协议中,比较重要的字段有:源端口:表示发送端端口号,字段长 16 位,2 个字节 目的端口:表示接收端端口号,字段长 16 位,2 个字节 序号(sequence number):字段长 32 位,占 4 个字节,序号的范围为 [0

2021-05-26 11:16:31 183 3

空空如也

空空如也

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

TA关注的人

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