自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于C++模板的一些知识总结

const修饰参数的话如果是形参不构成重载,因为只是拷贝了一个值进去,体现不了const,如果是指针引用类型的话构成重载。但是模板不行,我们要有这样一个观念,模板没有实例化之前,就是模板,不是任何的变量类型。这会导致其他文件的模板函数不会有具体实现,不会编译成具体的代码,进入不了符号表,导致链接的时候找不到。第一阶段是模板定义阶段,这个阶段不会检查类型参数,比如写错了,使用了不依赖于模板参数的符号等。重载的缺陷:如果要定义不同的add方式,就要定义很多个add函数,参数不同,比较麻烦。使用模板就比较方便。

2023-08-14 20:19:15 315

原创 mysql的整体架构

数据库读取页时,首先去缓冲池中查找该页是否存在,若不存在再去磁盘查找是否存在,若存在则将页放在缓冲池中,以便下次查找时,可以直接取出来。数据库修改页时,首先修改缓冲池中的页,然后再以一定的频率刷新到磁盘中。额外的:堆数据结构分配的,在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中申请。relog缓冲:为了实现数据持久化,避免宕机数据丢失,先写到缓冲中,由innodb负责写到文件中。合并插入缓冲是如果IO压力小,就先把索引放到缓存池,合并若干再刷新。

2023-07-27 18:37:20 1429

原创 关于网络通信安全协议的一些知识(ssl,tls,CA,https)

握手协议就是常说的https的四次握手过程(建立连接,协商秘钥,协商加密算法),不过四次握手还涉及到CA证书的验证。http3把TCP变成udp了, 并且在上层用QUIC协议保证可靠传输,速度更快了,并且QUIC,TLS在一层可以合并,所以连接只需要1RTT就够了,基于连接id还可以实现连接迁移。一般浏览器使用的CA证书都是存在于浏览器和操作系统的,所以可以保证CA证书的安全。crt:签名后或者自签名(rusttls)的证书:包括服务器公钥,服务器的id信息,以及签名人的信息。支持的加密算法不同。

2023-07-25 21:22:53 784

原创 docker和k8s、nginx、rpc、kafka的学习介绍和实战以及学习理念

(Service就相当于一组pod,也就是实现某种功能的一个进程集合,比如mysql的一组进程,也就是说,在进行service作为虚拟ip的时候,真正到的pod会变飘逸的,但是service不会变的,有点类似于NAT,可以实现负载均衡了。(主要有API和客户端交互接口,etcd键值数据库存储状态,调度器主要负责的是让pod在特定空闲节点运行,调度的策略包括资源的需求,亲和性(一组进程最好在一台主机进行,通信方便)还有一个controler控制器,负责故障的通知转移,以及副本,令牌控制等)

2023-07-14 19:16:51 1645

原创 常用树的数据结构总结

任意节点到叶子节点黑色数量相同(保证任意节点到其每个叶子节点路径最长不会超过最短路径的2倍,不是相差1这么严格了)最短的肯定都是黑色的,最长的黑红相间的。如果是黑色,如果孩子红色,补上变色,如果孩子黑色,分成6种情况,很复杂。第二就是磁盘是block读取的,每一页4kb就是一个B树节点,符合局部性原理,磁盘预读快,不然二叉树相邻元素不在一起,IO次数多。1.真正的数据只存在叶子结点,这点可以让每个节点可以存储更多的索引,导致树更加胖矮,IO次数更少。(保证树低,预读有效,减少IO次数)(保证不退化成链表)

2023-07-14 15:26:49 522

原创 代码优化的常用方式

比如缓存行填充,数组行优先存储,等等。IO不阻塞,合并IO ,采用缓冲区积累一定量才IO操作。(CPU缓存,IO缓存,数据库缓存等等)比如删除公共子表达式,删除无用代码,常量合并,循环不变计算外提,循环同步变量删除,强度削弱(加代替乘),基本块划分实现DAG,删除无用代码。比如二分查找算法,动态规划算法。(总结,删除无用代码,强度削弱,代码重构O2 O3优化,常量合并循环一些优化)采用并发提高速度,并同步注意锁的粒度,可以用原子类型;及时释放不再需要的变量和数据结构,避免内存泄漏和不必要的内存拷贝。

2023-07-04 20:29:50 553

原创 内存泄漏/内存安全如何排查

1、代码不多,并且比较熟悉的话。如果说core的时候已经不是第一现场了,可能出错的地方根本不在这里,尤其是使用一些其他的库,这些库底层到底使用了什么动态分配的机制我们不了解,就很容易内存泄漏。所以可以重载malloc,free写日志,比如写的是xxx函数分配了哪里的多大的内存,free就反过来,这样分析哪里出现泄漏了。里面保存的是当时内存的状态,比如寄存器的值,堆栈指针,函数调用等信息。它会告诉你肯定泄漏的地方,可能泄漏的地方,间接泄漏的地方。对于肯定的,修改就好,而可能,间接的需要再考虑。

2023-06-25 16:49:46 724 1

原创 makefile/cmake 简单介绍使用

Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(注意 Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。目标…: 依赖…(TAB) 命令1(TAB) 命令2意每条命令前必须有且仅有一个 tab 保持缩进,这是语法要求目标就是可执行的文件,依赖就是多个源文件重要的两个函数wildcard . patsubst INCSSRC :=wildcard./∗c。

2023-06-20 17:08:56 306

原创 SQL数据库的整体结构、索引、MVCC、锁、日志、查询优化,三大范式等

2、聚簇索引在增删改的时候比非聚簇索引慢很多,因为插入新数据时需要检测主键是否重复,这需要遍历主索引的所有叶节点,而非聚簇索引的叶节点保存的是数据地址,占用空间少,因此分布集中,查询的时候I/O更少,聚簇索引的主索引中存储的是数据本身,数据占用空间大,分布范围更大,可能占用好多的扇区,因此需要更多次I/O才能遍历完成。,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。

2023-05-31 09:40:02 1380

原创 rpc的相关知识

正是因为以上三点,导致一般大公司内部通信用rpc框架(因为内部的框架一致是前提条件,再者内部通信需要效率和可用性,其次不需要http可读性的优势因为封装在内部,你只需要调用接口)。http1.1这种和自定义的tcp协议有什么区别:http的头部有太多的冗余信息,而且是文本编码的。而RPC就是解决这一点的,RPC要求在调用方中放置被调用的方法的接口,就像调用本地的方法一样,不需要函数和参数了。最重要的一点其实是,rpc有面向服务的更多特性,比如服务发现,均衡负载,熔断机制等,更加可用性。

2023-05-25 20:22:02 640

原创 项目压测相关

SYN队列(半连接队列):当服务器端收到客户端的SYN报文时,会响应SYN/ACK报文,然后连接就会进入SYN RECEIVED状态,处于SYN RECEIVED状态的连接被添加到SYN队列,并且当它们的状态改变为ESTABLISHED时,即当接收到3次握手中的ACK分组时,将它们移动到accept队列。只要可读,就一直触发读事件,只要可写,就一直触发写事件。试想下1W个并发,connect的时候,队列满了之后,服务器就不理会客户的connect,客户只能再次尝试,如果碰巧这时候队列还是满的。

2023-05-25 16:52:07 1174

原创 C10K-C10M进阶(高并发的真正理解)

内存使用,缓冲区在读或写操作的时间段内必须保持住,可能造成持续的不确定性,并且每个并发操作都要求有独立的缓存,相比 Reactor 模式,在 Socket 已经准备好读或写前,是不要求开辟缓存的;(这里重点来了,我们分析了**,IOaccept以及IO监听分发不是瓶颈,瓶颈是处理请求来不及,而最大的弊端在于:消息队列因为是多线程取消息,需要加锁的。所以大大降低了速度。实际上以这样的硬件配置来看,它完全可以处理1000万个以上的并发连接,如果它们不能,那是因为你选择了错误的软件,而不是底层硬件的问题。

2023-05-23 15:03:56 576

原创 经典组件知识(zookeeper,kafka,ngix)

消息队列的作用解耦、削峰、 异步(非必要逻辑异步运行,加快响应速度)kafka首先有个topic的概念,类似于表。Partition 分区:一个topic下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。多个分区多个线程,多个线程并行处理肯定会比单线程好得多。Topic 也是逻辑概念,而 Partition 就是分布式存储单元。Replica 副本机制:Partition 为了保证数据安全,所以每个 Partition 可以设置多个副本。

2023-05-22 22:19:13 555

原创 redis问题汇总

在主从节点命令传播阶段,主节点收到新的写命令后,会发送给从节点。No 策略的话,是交由操作系统来决定何时将 AOF 日志内容写回硬盘,相比于 Always 策略性能较好,但是操作系统写回硬盘的时机是不可预知的,如果 AOF 日志内容没有写回硬盘,一旦服务器宕机,就会丢失不定数量的数据。缓冲区里所记录的写操作命令发送给从服务器,从服务器执行来自主服务器 replication buffer 缓冲区(包括主服务器生成RDB期间,发送给从服务器期间,从服务器接收期间)里发来的命令,这时主从服务器的数据就一致了。

2023-05-22 15:01:37 1268

原创 linux内核篇之虚拟化和容器化

如今,inux 服务器也随之变得越来越强大了。无论是计算、网络、存储,都越来越牛。但是也出现一些问题。1、资源大小申请不灵活。比如想尝试新业务,只需要单独的4核8G的服务器资源,但是不可能采购这么小规格的机器;以及,每次申请这个资源都需要重新采购,周期长;2、资源复用不灵活。别人的操作会导致冲突。必须要有自己单独的资源。为了解决这些问题,可以在物理机上创建虚拟机。。每次创建都是新的操作系统,很好的解决了上面不灵活的问题。虚拟机需要虚拟化层的支持。

2023-05-19 19:58:49 1030

原创 linux内核篇-进程间通信(信号,管道,共享内存,socket)

在linux操作系统中,为了响应各种各样的事件,也定义了很多信号。我们可以通过命令,查看所有的信号60多种。其中常见的信号有1: HUP,终端退出进程终止,可以被捕获2: INT,就是crtl+c ,终止前台进程;8 : FPE,算术运算出错,溢出,除0等;9:9 KILL,强行终止进程,不能被阻塞,捕获,忽略的。15: TERM,进程正常终止,通常捕获它,处理善后比如释放资源再退出;kill默认就是1519 SIGSTOP 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。

2023-05-19 14:58:41 958

原创 linux内核篇-输入输出系统(块设备,字符设备)

对于每一块,取出对应的内存中的页 page,在这一块中,有写入的起始地址 from 和终止地址 to,所以,第二层循环就是依次处理 from 到 to 的数据,调用 submit_page_section,提交到块设备层进行写入 submit_bio。块设备结构体是比较复杂的,因为它本身就复杂(比如一个硬盘不同分区可以是不同的文件系统)所以有一个gendisk来描述整个设备的(包括主设备号,分区设备号和数目以及分区对应的操作比如文件打开),通过操作gendisk的open操作来打开块设备。

2023-05-17 19:12:46 1273

原创 linux内核篇-文件系统(硬盘、虚拟文件系统、文件缓存)

文件系统的意义之前说的都是在进程在物理内存保存的数据,内存就像一个纸箱子,。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在外部存储中。我们最常用的外部存储就是硬盘,数据是以文件的形式保存在硬盘上的。为了管理这些文件,我们在规划文件系统的时候,需要考虑如下几点。文件系统的几个要点:1、严格的组织形式。以单位进行存储,比如图书馆的书架分成很多小格子;2、要有索引,实现快速查找;3、要有缓存,实现热点文件的快速应用;

2023-05-17 15:51:16 766

原创 linux内核篇-内存管理(虚拟内存和物理内存、进程虚拟内存布局、内存映射)

找到的是原来堆顶所在的vm_area_struct的下一个vm_area_struct,看当前的堆顶和下一个vm_area_struct之间还能不能分配一个完整的页(其实也就是堆和内存映射区之间还有多少剩余空间)如果不能,没办法只好直接退出返回,内存空间都被占满了。另外,内核也有内核栈的空间,前面说了,当系统调用进入内核态就需要内核栈,内核栈的特色就是thread_info是为了存储体系结构相关的信息(task_struct通用的),以及还有一块内存存放用户态的CPU上下文信息用于恢复现场的。

2023-05-17 10:35:00 1806

原创 linux内核篇-进程及其调度

如果当前运行的进程是普通进程,调度类为fair_sched_class,调用的处理时钟的函数为task_tick_fair,实现如下:根据当前进程的task_struct,找到对应的调度实体sched_entity和cfs_rq队列,调用entity_tick:update_curr更新当前进程的vruntime,然后调用check_preempt_tick,顾名思义,就是检测是否是时候被抢占了。线程有自己的pid,tgid是进程的主线程的pid,group_leader 指向的就是进程的主线程。

2023-05-15 20:30:11 942

原创 linux内核篇-操作系统综述和系统初始化

比如1号线程就是通过kernel_thread创建的,完成了用户进程,也就是内核态到用户态转换,其中由于文件必须存储在硬盘,所以必须有驱动,但是内核占据空间小,容不下各种各样的驱动,所以有了基于内存的文件系统,也有一个init程序用来加载实际的驱动和根文件系统,完成用户态各种任务),第2号进程kthreadd进程由第0号进程通过kernel_thread()创建,并始终运行在内核空间, 负责所有内核线程的调度和管理。这里的函数kthreadd,负责所有内核态的线程的调度和管理,是内核态所有线程运行的祖先。

2023-05-15 10:10:17 367

原创 C++新特性总结

创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std::future 对象调用 get(通常在另外一个线程中) 获取该值,如果共享状态的标志不为 ready,则调用 std::future::get 会阻塞当前的调用者,直到 Provider 设置了共享状态的值(此时共享状态的标志变为 ready),std::future::get 返回异步任务的值或异常(如果发生了异常)而迭代器的类型有时候比较复杂,书写起来很麻烦;

2023-05-08 20:05:58 1130

原创 C++的类、模板等相关知识点

一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现了二义性,不知道变量是从哪个基类继承的。友元可以是一个函数,该函数被称为友元函数;

2023-05-04 11:59:41 727

原创 C++中的锁总结

在同一时刻,我们只需保证对某个内存地址的操作是原子性即可,但总线锁定把CPU和内存之间的通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以总线锁定的开销比较大,目前处理器在某些场合下使用缓存锁定代替总线锁定来进行优化。但是,也不是说原子操作或者自旋锁(自旋锁一定程度上就是原子锁,只不过有临界区)一定比互斥锁快,以为当并发竞争很大的时候,CAS会导致太多的失败尝试,CPU消耗,这时候就不如使用互斥锁了。自旋锁亦可以用原子操作实现啊CAS的作用,它就是实现乐观锁的啊,可以实现自旋锁吗?

2023-04-30 10:30:40 1784

原创 关于秒杀系统的一系列问题

(加一张消息处理表,先判断表里有没有,有就直接返回,没有就下单并且加入到处理表,要保证原子操作):既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。问题:原因有很多,比如:网络问题、broker挂了、mq服务端磁盘问题等(解决思路,消费前,先写入消息表,转态为待处理,只有成功消费,回调函数修改状态为已处理,每隔一段时间检查消息表,待处理就重试)

2023-04-27 20:08:18 663

原创 tcp,udp一些列问题

一般来说,提交一个GET或POST指令对客户端的耗费和带宽的占用是几乎可以忽略的,而服务器为处理此请求却可能要从上万条记录中去查出某个记录,这种处理过程对资源的耗费是很大的,常见的数据库服务器很少能支持数百个查询指令同时执行,而这对于客户端来说却是轻而易举的,因此攻击者只需通过 Proxy代理向主机服务器大量递交查询指令,只需数分钟就会把服务器资源消耗掉而导致拒绝服务,常见的现象就是网站慢如蜗牛、ASP程序失效、PHP连接数据库失败、数据库主程序占用CPU偏高。其实第三次握手的时候,是可以携带数据的。

2023-04-26 09:57:23 739

原创 rust的现状和未来发展

1、第一层,首先从语言本身来说,难度大,特性多是客观事实,但是这也表示rust是博采众长的,吸收了C,C++等其他语言的精华,当然你可能会说没有必要这么做,每种语言利用自己的特性做自己擅长的事情就可以了。现在的语言是无法兼顾两者的,比如C++高性能,但是内存安全问题是很难避免的,全靠经验,而且很多stl库和其他库涉及的内存操作我们并不知晓,具体的内存安全问题可以看前几篇介绍。接下来剩下一些非必须的基础库,可能是某一些业务单独的库,就可以发动群众的力量,因为它只要最基础的这些东西。而且最重要的一点,你可以。

2023-04-23 17:34:27 6469 2

原创 kv server(配置以及性能测试)

因为 BROADCAST_CAPACITY 有限,是 128,当 publisher 速度太快,而导致 server 不能及时往 subscriber 发送时,server 接收 client 数据的速度就会降下来,无法接收新的 client,整体的 publish 的速度也会降下来,所以这个测试能够了解 server 处理 publish 的速度。对于要测试的代码,我们可以封装成一个函数进行测试。你可以看到,在 Rust 下,有了 serde 的帮助,处理任何已知格式的配置文件,是多么容易的一件事情。

2023-04-22 17:01:00 517

原创 rust异步编程以及kv server的异步处理和重构

最开始,执行器会先 poll 一次 Future ,后面就不会主动去 poll 了,如果 poll 方法返回 Poll::Pending,就挂起 Future,直到收到某个事件后,通过 wake()函数去唤醒被挂起 Future,Future 就可以去主动通知执行器,它才会继续去 poll,执行器就可以执行该 Future。对于我们的网络层来说,可以先不关心背压,依靠操作系统的 TCP 协议栈提供背压处理即可,所以这里直接返回 Poll::Ready(Ok(())),也就是说,上层想写数据,可以随时写。

2023-04-18 09:44:15 528

原创 rust的并发以及kv server网络处理和网络安全部分

Atomic 虽然可以处理自由竞争模式下加锁的需求**,但毕竟用起来不那么方便,我们需要更高层的并发原语**,来保证软件系统控制多个线程对同一个共享资源的访问,使得每个线程在访问共享资源的时候,可以独占或者说互斥访问(mutual exclusive access)。主要的思路就是在序列化数据的时候,添加一个头部来提供 frame 的长度,反序列化的时候,先读出头部,获得长度,再读取相应的数据。使用 Mutex 时,你需要很小心地避免死锁,控制临界区的大小,防止一切可能发生的意外。

2023-04-15 14:49:08 1146

原创 rust网络编程以及unsafe模块

此外,因为线程的调度是操作系统完成的,每次调度都要经历一个复杂的、不那么高效的 save and load 的上下文切换过程,所以如果使用线程,那么,在遭遇到 C10K 的瓶颈,也就是连接数到万这个级别,系统就会遭遇到资源和算力的双重瓶颈**。因为 Send / Sync 是 auto trait,所以大部分情况下,你自己的数据结构不需要实现 Send / Sync,然而,当你在数据结构里使用裸指针时,因为裸指针是没有实现 Send/Sync 的,连带着你的数据结构也就没有实现 Send/Sync。

2023-04-13 15:45:02 1469

原创 如何在rust中使用泛型,trait对象的总结以及kv sever(3)

可以说在 Rust 开发中,泛型编程是我们必须掌握的一项技能。在你构建每一个数据结构或者函数时,最好都问问自己:**我是否有必要在此刻就把类型定死?**是不是可以把这个决策延迟到尽可能靠后的时刻,这样可以为未来留有余地?如果我们能通过泛型来推迟决策,系统的架构就可以足够灵活,可以更好地面对未来的变更。前面学习到trait可以实现参数多态,就是函数或者数据结构用T表示,不是具体类型;还可以实现特设多态,也就是函数重载,一个函数接口不同的参数有不同的实现;更牛逼的就是trait做参数的时候,可以实现特征约束

2023-04-13 10:00:38 646

原创 rust中的集合容器(切片和哈希)与错误处理

例如考虑一个场景,有一张表格中记录了足球联赛中各队伍名称和积分的信息,这张表如果被导入到 Rust 项目中,一个合理的数据结构是 Vec 类型,该数组中的元素是一个个元组,该数据结构跟表格数据非常契合:表格中的数据都是逐行存储,每一个行都存有一个 (队伍名称, 积分) 的信息。,不想当时处理,就用?在实际使用中,不是所有的场景都能 new 一个哈希表后,然后悠哉悠哉的依次插入对应的键值对,而是可能会从另外一个数据结构中,获取到对应的数据,最终生成 HashMap。

2023-04-10 15:55:59 660

原创 rust中的智能指针

不同的是cell是通过get获取到的是原有对象的拷贝,适合实现了Copy的类型,或者体积小的struct,因为get方法是直接按位复制的。堆上分配内存的 Box其实有一个缺省的泛型参数 A,就需要满足 Allocator trait,这其实是指定一种内存分配器,并且默认是 Global,当然也可以替换成自己的内存分配器。我们先来复习一下C是怎么分配堆内存的。String(智能指针) 对堆上的值有所有权,而 &str(胖指针) 是没有所有权的,这是 Rust 中智能指针和普通胖指针的区别。

2023-04-10 10:40:01 534

原创 类型系统和trait相关

特征就是定义一个共同的行为集合,做接口类,不同的类型可以具体实现这些行为,这就实现了ad-hoc,同一个函数签名,不同类型的参数使用,具体实现不一样。还有一些表达式,有时有返回值,有时没有返回值(也就是只返回单元值),或者有时返回正确的值,有时返回错误的值,Rust 将这类情况也纳入了类型系统,也就是。几乎总是使用特征对象的引用方式,如 &dyn Draw、Box(虽然特征对象没有固定大小,但它的引用类型的大小是固定的,它由两个指针组成(ptr 和 vptr),因此占用两个指针大小)

2023-04-09 21:48:10 479 4

原创 rust构建一个简单的KV server-基本流程(1,2)

为什么选 KV server 来实操呢?因为它是一个足够简单又足够复杂的服务。参考工作中用到的 Redis / Memcached 等服务,来梳理它的需求。最核心的功能是根据不同的命令进行诸如数据存贮、读取、监听等操作;而客户端要能通过网络访问 KV server,发送包含命令的请求,得到结果;数据要能根据需要,存储在内存中或者持久化到磁盘上。先来一个短平糙的实现如果是为了完成任务构建 KV server,其实最初的版本两三百行代码就可以搞定,但是这样的代码以后维护起来就是灾难。我们看一个省却了不少细节

2023-04-08 20:20:37 646

原创 rust值的创建使用销毁过程

所有权机制规定了,一个值只能有一个所有者,所以在释放堆内存的时候,整个过程简单清晰,就是单纯调用 Drop trait,不需要有其他顾虑。比如我们创建一个文件 file,往里面写入 “hello world”,当 file 离开作用域时,不但它的内存会被释放,它占用的资源、操作系统打开的文件描述符,也会被释放,也就是文件会自动被关闭。所以都是比较高效的。它默认将堆内存的生命周期和使用它的栈内存的生命周期绑定在一起,并留了Box::leak机制,让堆内存在必要的时候,可以有能力超出帧存活期的生命周期。

2023-04-07 10:34:21 336

原创 rust的所有权和生命周期问题,借用问题

但是,这也会让代码变复杂,尤其是一些只存储在栈上的简单数据,如果要避免所有权转移之后不能访问的情况,我们就需要手动复制,会非常麻烦,效率也不高。所有权还是原来的人的,你知识借用一下。比如传参的时候,用&arr,就是借用了,只读借用实现了copy语义,也就是堆上数据的指针会复制一份给函数,但是函数并不拥有数据本身,数据只是临时借给它使用,所有权还在原来的拥有者那里。那么,一些原生类型比如整数,浮点数等简单类型,组合类型,以及函数,裸指针都是copy语义,这些都比较小,浅拷贝栈上可以放的下去,不会转移所有权。

2023-04-06 21:26:57 482 1

原创 设计模式总结

在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。更重要的是符合开闭原则,比如想要扩展委托类的功能,就不用修改委托类,委托类通常是执行业务的,封装好的。当对象的创建逻辑比较复杂,不只是简单的 new 一下就可以,而是要组合其他类对象,做各种初始化操作的时候,我们推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂。,而且可以独立地改变它们之间的交互。

2023-04-06 09:30:57 373

原创 认识rust的项目管理工具--cargo

/target/debug/world_hello(debug 模式,在这种模式下,代码的编译速度会非常快,可是福兮祸所伏,运行速度就慢了. 原因是,在 debug 模式下,Rust 编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。cargo 提供了一系列的工具,从项目的建立、构建到测试、运行直至部署,为 Rust 项目的管理提供尽可能完整的手段。,如果 Rust 开发者希望 Rust 项目能够按照期望的方式进行构建、测试和运行,那么,必须按照合理的方式构建 Cargo.toml。

2023-04-04 17:43:47 802 1

空空如也

空空如也

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

TA关注的人

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