自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HTTP各个版本的区别

HTTP/1.0——短连接版本HTTP/1.0规定浏览器与服务器只保持短暂的连接,即每一次请求都需要与服务器建立一次TCP连接,服务器完成请求处理后立即断开TCP连接。服务器不会跟踪每个客户也不记录过去的请求。(说完就挂断)因此这样的连接无法复用,每个TCP连接只能发送一个请求,发送完毕连接关闭。这个版本的HTTP性能很差,因为TCP建立连接的过程是一个很耗时的过程。HTTP/1.1——长连接版本为了解决1.0的缺陷,该版本最主要的改进就是引入了持久连接,即TCP连接默认不关闭,可以被多个请

2022-04-07 21:35:50 684

原创 STL空间配置器(一级配置器及二级配置器)

前言在我们日常使用STL中的容器时,我们是几乎感受不到空间配置器的存在,因为他一直在默默工作,我们在之前的这一篇博客中也大概介绍过:C++(21)——vector及实现自定义vector以及allocator和iterator空间配置器,整个STL的操作对象都存放在容器之后。而容器需要配置空间以放置资料,这也就是空间配置器的作用。注:STL提供了自定义空间配置器的接口,但是不建议自己定义,因为系统提供的空间配置器是足够安全且高效的,所以在我们使用时,一般会使用默认的配置器。template<cl

2022-04-06 23:09:16 1650 1

原创 Proactor模型

前言上一篇讲解的Reaactor是非阻塞的同步网络模式,而Proactor是异步网络模式。至于异步IO怎么理解:可以参考我的这一篇博客:Linux的五种IO模型理解之后:你就会感受到:很明显,异步 I/O 比同步 I/O 性能更好,因为异步 I/O 在「内核数据准备好」和「数据从内核空间拷贝到用户空间」这两个过程都不用等待。因此:Reactor 可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」Proactor 可以理解为「来了事件操作系统来处理,处理完再通知应用进程」。这里的「

2022-04-03 23:29:18 1690

原创 Reactor模型

前言首先让我们来回顾一下select、poll和epoll是如何获取网络事件的:在获取事件时,先把我们要关心的连接传给内核,再由内核检测:若没有事件发生,线程只需阻塞在这个系统调用,而无需使用类似于线程池轮询调用read操作来判断是否有数据;如果有事件发生,内核会返回产生了事件的连接,线程就会从阻塞状态返回,然后在内核态中再处理这些连接处理这些对应的业务即可。我们也发觉,当下网络高性能的一个主要原因就是:IO多路复用的使用,但是使用过IO多路复用接口编写网络程序的人都会觉得这种开发的效率属

2022-04-03 22:45:18 1204

原创 复习:字节对齐的原则

为什么需要字节对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。字节对齐的作用及原因各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平

2022-04-01 11:20:52 165

原创 复习:Linux中的软连接和硬连接

前言首先我们先来复习以下Linux的文件系统Linux的文件系统是EXT4以EXT4文件系统格式化磁盘时,将磁盘分成了三个区,分别是:1、superblock:记录文件系统的整体信息,包括inode和block的总量,使用量、剩余量。2、inode:很多节点,给每一个inode都分配一个编码,一个文件会有一个inode节点,在此inode中存储文件的属性信息以及存储文件内容的那些block号3、block: 很多block,给每一个block都分配了一个编号,每个block用于存储文件的真实内

2022-03-30 21:37:30 304

原创 LInux——五种IO模型

Linux中的IO简述IO主要分为以下的三种:内存IO网络IO磁盘IO通常我们所说的IO是后两者,Linux中无法直接操作IO设备,必须通过系统调用请求kernal来协助完成IO的动作,内存会为每一个IO设备维护一个缓冲区。IO操作会涉及两个对象:调用这个IO的进程(或线程);系统内核的kernal五种模型介绍1、阻塞IO最简单的一种IO模型,简单理解就是死等,即进程或线程一直等待某个条件,不满足就会一直等待。2、非阻塞IO应用进程与内核交互,不断轮询,不停地去问内核数据是

2022-03-30 20:50:42 1147

原创 复习:结构体大小的内存对齐问题

内存对齐内存对齐是指:任意单个类型的数据都需要存放在能被它本身大小所能整除的地址上。基本类型的大小,char(1),short(2),int(4) ,long(4),long long(8),float(4),double(8) ,指针(4/8)预处理指令:#pragma pcak(1) ——内存以1对齐内存对其的规则前面的所有成员字节相加要能整除当前成员的字节数;结构体最终的大小,一定能整除单个类型的大小。注意 是==单个类型!!!!即基本数据类型。示例类型1typedef s

2022-03-29 18:45:27 422

原创 Redis(5)——缓存穿透和雪崩

概要Redis缓存的使用,极大的提高了应用程序的性能和效率,特别是数据查询等。但同时,它也带来了一些问题。其中,最主要的问题就是数据一致性,从严格意义上来讲,这个问题是无解的。如果对数据一致性要求很高,那么就不能使用缓存。另外一个典型的问题就是:内存穿透,内存击穿和内存雪崩问题。目前,业界也都有比较流行的解决方案。缓存穿透(查不到)缓存穿透用户想要查询一个数据,发现Redis中没有,也就是缓存没有命中,于是向持久层数据库发起查询,发现也没有这个数据,于是本次查询失败。当用户很多的情况下,缓存

2022-03-28 23:23:38 171

原创 Redis(4)——主从复制

Redis主从复制主从复制:指的是将一个Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower)。数据的复制是单向的 ,只能从主节点到从节点。Master以写为主,Slave以读为主。默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或者没有从节点),但一个从节点只能有一个主节点。主从复制的作用主要包括:数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗

2022-03-28 22:26:50 261

原创 Redis(3)—— 持久化、发布订阅

持久化Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化的功能。1、RDB(Redis DataBase)在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存中。Redis会单独创建(fork)一个子进程来进程持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上一次持久化好的文件。整个过程中,主进程是不进行任何IO

2022-03-28 16:24:29 1320

原创 Redis(2)——事务机制

Redis的事务机制Redis的事务本质:一组命令的集合一个事务中的所有命令都会都被序列化,在事务执行的过程中,会按照顺序执行!一次性、顺序性、排他性——执行一系列的命令Redis没有事务隔离级别的概念所有命令在事务中,并没有直接被执行!只有发起执行命令(Exec)才会执行!Redis的单挑命令保存原子性,但是事务不保证原子性。Redis的事务使用过程开启事务——multi命令入队—— ...执行事务——exec正常执行事务127.0.0.1:6379> multi

2022-03-28 14:05:32 493

原创 Redis(1)——基本命令及数据类型(5+3)

Redis的基本概念Remote Dictionary Server:远程字典服务Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件 。它支持多种类型的数据结构,如字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps,hyperloglogs 和地理空间(geospatial) 索引半径查询。Redis 内置了 复制(replication),

2022-03-28 12:57:20 1243

原创 Redis入门——发展历程及NoSQL

前言随着社会的发展,数据存储经历了诸多的过程,这篇文章就是介绍Redis的发展由来:1、单机Mysql时代这种模式存在以下的瓶颈:数据量太大,一个机器存放不下数据的索引太大,一个机器的内存放不下访问量(读写混合)太大,一个服务器承受不住在这之后,我们试着做一些优化,比如:优化数据结构和索引——>文件缓存IO——>Memcached2、 缓存Memcachaed+读写分离(垂直拆分)网站上80%的情况都是在读,每次都去查询数据库,效率很低。这时候可以加入缓存机制,第一次查

2022-03-27 14:33:06 600

原创 项目——C++实现数据库连接池

前言在学习Mysql的时候,我们都有这个常识:对于DB的操作,其实本质上是对于磁盘的操作,如果对于DB的访问次数过多,其实就是涉及了大量的磁盘IO,这就会导致MYsql出现性能上的瓶颈。项目背景为了提高Mysql数据库的访问瓶颈,常用的方法有如下两个:在服务器端增加缓存服务器缓存常用的数据(例如redis)增加连接池,来提高MYsql Server的访问效率,在高并发的情况下,每一个用户大量的TCP三次握手。Mysql Server的连接认证,Mysql Server关闭连接回收资源和TCP四次

2022-03-26 21:30:56 3961 3

原创 Mysql(17)——优化

前言一、SQL和索引优化二、应用优化除了优化SQL和索引,很多时候,在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对上层的应用来进行一些优化,使得上层应用访问数据库的压力能够减到最小。2.1、连接池应用上一般访问数据库,都是先和MySQL Server创建连接,然后发送SQL语句,Server处理完成后,再把结果通过网络返回给应用,然后关闭和MySQL Server的连接,因此短时间大量的数据库访问,消耗的TCP三次握手和四次挥手所花费的时间就很大了,稍微大一点的项目,我们都会在应用

2022-03-25 11:07:22 1176

原创 Mysql(16)——日志

一、错误日志错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。mysqld 使用错误日志名 host_name.err(host_name 为主机名) 并默认在参数 DATADIR(数据目录)指定的目录中写入日志文件。二、查询日志查询日志记录了客户端的所有语句。由于上线项目sql特别多,开启查询日志IO太多导致MySQL效率低,只有在调试时才开启,比如通过

2022-03-25 10:43:13 964

原创 Mysql(15)——锁机制 + MVCC(全)

前言事务的隔离级别在之前我们已经学习过,那么事务隔离级别的实现原理是什么呢?锁+MVCC表级锁&行级锁注意:表锁和行锁说的是锁的粒度,不要以为它与下面讲到的其他锁是单独的概念。因为有表级共享锁等概念的存在。表级锁:对整张表加锁。开销小,加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度低。行级锁:对某行记录加锁。开销大,加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高。排它锁&共享锁排它锁(Exclusive),又称为X 锁,写锁。共享锁(Sh

2022-03-24 14:28:33 1823

原创 Mysql(14)——事务

概念一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元。只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务要么全部执行成功,要么全部失败。所以记住事务的几个基本概念,如下:事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行的原子操作。事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。事务执行过程中,有的SQL

2022-03-22 15:32:07 1085

原创 简单算法——二分搜索的递归版本和非递归版本

二分搜索这是大家比较熟悉的算法了,我们今天来复习一下:前提:二分查找要求所查找的顺序表必须是有序的。算法思路定义left为顺序表最左端元素位置,right为顺序表右端元素位置。定义mid = (left + right) / 2,即顺序表的中间位置,然后用所查找的值与mid所在位置处的值比较,由于列表有序,若所查找的值比mid小,则只需在表的前半部分查找,否则只需在表的后半部分查找(若第一次比较就发现两值相等则直接返回当前值所在的位置),以此类推,直至查找到所寻找的值或确定所查找的值不在该列表内为

2022-03-21 21:04:12 446

原创 Mysql(13)——Memory的哈希索引及InnoDB的自适应哈希索引

前言我们知道InnoDB和MyISAM存储引擎支持的都是B+树索引,还有一个memory存储引擎(一个基于内存的存储引擎),他支持哈希索引,那么哈希索引到底是怎么回事呢?这就是我们今天要学习的内容。(了解即可)对于哈希索引(链式哈希表)来说,假设在表中,我们将name设置索引,那么其建立的索引的大致结构如下(简略图):其中我们根据建立索引的列(name)由哈希函数计算出hashkey后再和桶数取模,将name放进对应的桶中,由此我们也就不难看出,hash表中的元素没有任何顺序可言,所以它也就更适

2022-03-21 16:22:45 681

原创 Mysql(12)——聚集索引和非聚集索引

MyISAM的索引树相关主键索引树这一部分我们之前在MyISAM的存储结构中也有所提及,我们也知道MyISAM使用B+树作为索引结构,叶节点的data域存放的是数据记录的地址。(因为MyISAM存储引擎的数据和索引是分开存放的,分别是*.MYI和*.MYD),其索引树的data存放的是表中记录的地址,下图是MyISAM主键索引的原理图:辅助索引树在MyISAM中,主索引和辅助索引在结构上没有任何区别, data内存放的依然是数据的地址,都是通过寻址找到响应的数据data(这也是与InnoDB的

2022-03-21 15:05:49 1001

原创 Mysql(11)——InnoDb的主键索引树和二级索引树

前言上一节我们学习了B+树的索引底层的相关知识,先来复习一下,再进入今天的内容:假设存在如下的表:注意想想B+索引树的存储结构场景一:uid是主键select * from student;对于上面的sql,在建立了主键索引树后,在底层叶子结点上会进行整表遍历。场景二:uid是主键的等值查询select * from student where uid=5;对于上面的sql,在建立了主键索引树后,会在叶子节点上二分查找到目标结点。场景三:uid是主键的范围查询select *

2022-03-21 14:50:19 640

原创 Mysql(10)——B+树索引详解

前言上一篇博客我们讲到了B-树索引,但是其实大家都知道Mysql(MYISAM和InnoDb)最终使用的是B+树索引,那么这么做的原因是什么?这也就是接下来的内容。B-树索引存在的问题问题1:索引+数据内容分散在不同结点上,距离根结点近搜索就快,距离根结点远搜索就慢,也就是花费的磁盘IO的次数不平均,每一行数据搜索花费的时间也不平均;问题2:每一个非叶子结点上不仅仅要存索引(key),还要存储索引值所在的那一行的数据,一个结点(固定大小)所能存放的索引key值的个数比只存储key值的结点的个数

2022-03-20 22:33:01 842

原创 Mysql(9)——B-树索引详解

索引的底层实现原理数据库索引是存储在磁盘上的;当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低;越“矮胖”——>磁盘IO次数就少xxx有索引==》 存储引擎==》kernel==》磁盘IO(读索引文件)==》内存上MySQL支持两种索引:B-树索引哈希索引大家知道,B-树和哈希表在数据查询时的效率是非常高的。这里我们主要讨论一下MySQL InnoDB存储引擎,基于B-树(但实际上MySQL采用的是B+树结构)的索引结构

2022-03-20 21:52:20 950 1

原创 Mysql(8)——索引初步及explain

Mysql索引当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及磁盘I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此掌握良好的索引创建原则非常重要!索引分类索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种结果。索引的核心是提高查询的速度!索引的优点: 提高查询效率索引的缺

2022-03-20 20:32:30 704

原创 行为者模式1——观察者模式(发布-订阅)

观察者模式该模式也叫作发布-订阅模式,观察者模式主要关注的是对象的一对多的关系,也就是多个对象依赖于一个对象,当该对象的状态发生改变时,其他对象都能够收到相应的通知并自动更新。我们可以将观察者模式理解为,订阅一份报纸。首先决定订阅报纸的时候,需要去报刊告诉相关工作人员;填写自己订阅的信息,比如想要订阅什么类型的报纸(体育类、财经类等),之后留下自己的住址(这样就可以享受送报上门服务了)。示例:一组数据(数据对象)—— 曲线图(对象1)/ 柱状图(对象2)/ 圆饼图(对象3)当这组数据发生变化时,对

2022-03-20 19:25:44 654

原创 结构型模式3——适配器模式

适配器模式(Adapter Pattern)适配器模式是作为两个不兼容的接口之间的桥梁,增加一个适配器类使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决的问题:主要解决在软件系统中,常常要将一些“现存的对象”放到新环境中,而新环境的接口是现有对象不能满足的。我们用下面的情境来解释一下适配器模式:我们用电脑投影到投影仪上时,投影仪Project有VAG和HDMI以及Type-C等多种接口在前几年,投影仪和电脑的接口都是VAG,无疑,直接连接就可:代码实现如下:class VG

2022-03-20 17:26:34 136

原创 结构型模式2——装饰器模式

装饰器模式(Decorator Pattern)装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构,它是作为现有的类的一个包装。以我们之前的Car为例,假设三种汽车我们需要给他们加上定速巡航或者自动刹车的功能,那么我们就需要通过实现子类的方式,重写接口,每增加一个功能,不同的车型都需要增加一个子类,这样理论上是可以完成功能的,但是代码中有太多的子类添加进来了。动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比新增加子类实现更为灵活。使用时机: 在不想添加子类的情况下扩展类

2022-03-20 16:43:38 79

原创 结构型模式1——代理模式

结构型模式这一类设计模式不关注对象的产生,关注的是类和对象的组合后功能的使用,是否符合场景的需求。代理模式(Proxy Pattern)代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。模型化思想:客户 —— 助理(Proxy)—— 老板代理模式体现的就是:对老板访问权限的一些控制,并不是所有的客户都可以访问老板,地位身份不够的客户就会被助理阻挡从而访问不到老板。代

2022-03-20 15:34:44 126

原创 创建型模式2——工厂模式(简单工厂、工厂方法、抽象工厂)

简单工厂模式动机意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。简单工厂模式结构比较简单,其核心是工厂类的设计:简单工厂模式中包含以下的几个角色:Factory(工厂角色):工厂类,它是简单工厂的核心,工厂类可以被外部直接调用,创建所需的产品对象,在工厂类中提供了静态的工厂方法factoryMe

2022-03-20 14:30:28 228

原创 C++(32)——多线程编程(互斥、同步、CAS原子操作)

线程线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程。从资源分配的角度来看,进程是操作系统进行资源分配的基本单位。从资源调度的角度来看,线程是资源调度的最小单位,是程序执行的最小单位一个进程可以并发执行多个线程,每个线程会执行不同的任务。对应在现实生活中,进程是组长,线程是小组成员。语言级别的多线程的优势:可以跨平台运行其原理就是:语言层面上的thread可以通过编译器的编译的宏信息识别操作系统,系统底层使用仍然是使用底层API如下:windows:createThre

2022-03-19 22:24:10 860 2

原创 C++(31)——C++11常用知识点整理

前言C++11在如今的公司开发过程中,C++11的代码形式和一些优秀的开源代码中,都会使用到C++11的一些特性,使得代码更加简洁,逻辑更加清楚。C++11的新标准很多,但是对于开发者来说,我们不一定会都使用到,本文主要总结一下之前的编码过程中高频出现的的内容。关键字与语法方面auto:可以根据右值,推导出右值的类型,然后左边变量的类型也就已知了nullptr:给指针专用(能够和整数进行区别)以前的NULL是一种宏定义,即#difine NULL 0,我们在代码中其实是无法区分整数和地址,有了n

2022-03-19 16:23:36 1069

原创 C++(30)——lambda表达式原理及应用

lambdalambda这个词起源于数学上的λ,在C++中利用lambda表达式,可以方便的定义和创建匿名函数。lambda可以看做函数对象的升级版。改进了函数对象以下的缺点:使用在泛型算法中的参数传递的过程中比较性质/自定义操作优先级队列智能指针lambda表达式语法[捕获外部变量](形参列表)->返回值{操作代码};如果lambda不需要返回值,那么返回值可以省略。也就是这样:[捕获外部变量](形参列表){操作代码};捕获外部变量的方式:[]:表示不捕获任何外部变量

2022-03-19 16:05:15 1220

原创 C++(29)——bind绑定器和function函数对象

绑定器和函数对象函数对象我们之前以及提到了,函数对象就是类方法中有operator()运算符重载的。在使用时和函数很类似。绑定器在C++ STL库中有两个绑定器绑定器 + 二元函数对象 = 一元函数对象bind1st: operator()的第一个形参变量绑定成一个确定的值。bind2nd:operator()的第二个形参变量绑定成一个确定的值。但是其实在复杂的应用场景下,这两个绑定器并不能满足应用的需求,于是在C++11中从Boost库中引入了bind绑定器和function函数对象机制

2022-03-19 15:13:55 1347

原创 复习:智能指针

智能指针介绍学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭喊着指针不好用,那么今天要介绍的智能指针可以释放大家在使用裸指针时的一些压力,当然智能指针无法替代裸指针的全部功能。裸指针到底有什么不好,写过一些C++代码的人应该都能知道,比如下面的原因:忘记释放资源,导致资源泄露(常发生内存泄漏问题)同一资源释放多次,导致释放野指针,程序崩溃明明代码的后面写了释放资源的代码,但是由于程

2022-03-18 13:59:41 120

原创 C++(28)——从自定义String和vector理解移动语义和完美转发

自定义vector和Sring的结合使用代码如下:class CMyString{public: CMyString(const char* str = nullptr) { cout << "CMyString(const char*)" << endl; if (str != nullptr) { mptr = new char[strlen(str) + 1]; strcpy(mptr, str); } else { mpt

2022-03-17 15:02:25 250

原创 C++(27)——从自定义String类型理解右值引用

前言我们是用之前的自定义String类,再一次对右值引用进行深入了解,尽管我们之前的博客已经谈到这个问题,先来回顾一下MyString:class CMyString{public: CMyString(const char* str = nullptr) { cout << "CMyString(const char*)" << endl; if (str != nullptr) { _pstr = new char[strlen(str) + 1];

2022-03-17 13:50:51 333

原创 C++(26)——对象被优化以后才是最高效的C++编程

对象应用优化我们都知道,C语言和C++在程序执行中,都是通过调用一系列的函数来实现的。并且,很多时候,编译器会帮助我们做一系列的事情,比如(在编译类的成员方法的时候,编译器默认添加 this 指针,以此来确定是哪一个对象调用了该成员方法)。得益于编译器或者说系统帮助我们做的一系列事情,我们可以更加方便地使用C++。但是凡事有利必有弊,因为系统有时候会自己调用一系列的函数,从另一个角度来说,也一定程度上降低了效率。而我们想要提高C++的执行效率,就需要了解程序(主要是对象)使用过程中都调用了哪些方法。先

2022-03-17 13:14:16 1028

原创 C++(25)——STL

STL内容一览c++ STL (standard template libaray)标准模板库一:标准容器1、顺序容器vector(向量容器)deque(双端链表容器)list(链表容器)2、容器适配器stackqueuepriority_queue(基于大根堆实现的优先级队列)3、关联容器(重点)无序关联容器 链式哈希表 增删查O(1)unordered_set(无序单重集合)unordered_multiset(无序多重集合)unordered_map(无序单重

2022-03-16 16:12:51 1174

空空如也

空空如也

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

TA关注的人

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