- 博客(29)
- 收藏
- 关注
原创 变量在栈中比在堆中有什么优势
栈为什么比堆执行快1.栈内存访问,内存地址获取指令是栈寄存器加一个很小的偏移量。另外,因为栈内存及访问栈内存的指令通常都会位于CPU一级缓存中,所以这个内存访问基本不会再快了。2.堆内存访问首先要从内存读指针地址,然后再用这个指针地址加偏移量去访问堆内存,这就导致了多一个读指令。另外,堆内存很可能不处于缓存里,尤其是第一次访问,这会导致堆和栈出现巨大的速度差异。如果再发生缺页中断,3.堆内存需要做内存申请,这是极为耗时的操作,如果把内存申请的消耗计算在内,那栈内存的综合速度优势就又多了一项。...
2022-06-11 14:23:45
359
原创 20年后,哪些编程语言会留下
首先应该阐明一下留下的概念,应该是指该语言还在持续不断的创造有影响力的新应用。按照stackoverflow的最流行的几种语言来分析一下:1.JavaScript,我认为毫无疑问将继续流行,当然,也有可能是TypeScript。但这两者认为是一体应该没有太大的毛病。2.SQL,应该没有什么能替代它3.Python 它的优点是语法足够简单,生态足够好,开发效率足够高。但性能是它致命的缺点。有影响力的商业应用估计不是它的强项,但开发一些小的工具,原型,将已有的组件连接在一起仍然优选它,前提是没有显著强于
2022-06-08 08:07:45
296
原创 RUST标准库channel模块Queue源代码分析
RUST标准库中mpsc模块有一个用于多线程发,单线程收的Queue实现,极其精巧,值得学习及牢记//以下是简单的FIFO的队列实现pub enum PopResult<T> { //返回队列成员 Data(T), //队列为空 Empty, //队列的一致性出错 Inconsistent,}//节点结构struct Node<T> { //next指针,利用原子指针实现多线程的Sync,值得牢记 next:
2022-05-31 08:38:56
478
原创 RUST标准库中双向链表LinkedList<T>源代码分析
对RUST标准库的LinkedList的源代码进行了分析。从中可以看出RUST相对于其他语言的独特点在哪里。
2022-04-29 07:36:17
1247
原创 从RUST标准库插入排序代码实现看RUST所有权的本质
内容为下书章节摘录深入RUST标准库内核(序言)深入RUST标准库内核(一)概述深入RUST标准库内核(二)内存深入RUST标准库内核(三)内存续深入RUST标准库内核(四)基础Trait深入RUST标准库内核(五)Iterator深入RUST标准库内核(六)基础类型切片排序需要对切片内元素做大量的迁移,这些迁移的所有权怎么处理的?这个处理揭示了RUST所有权的本质/// 插入排序, 复杂度O(n^2).fn insertion_sort<T, F>(v: &mut
2022-02-24 12:41:49
611
1
原创 深入RUST标准库内核(五)Try/Index/IndexMut/Range trait
本节主要对标准库的Iterator的代码实现做分析。具体包括Range的Iterator实现,切片类型的Iterator实现,字符串的Iterator实现,数组的Iterator实现。并给出切片排序算法之一的插入排序代码分析
2022-02-05 22:23:36
1435
原创 深入RUST标准库内核(四)intrinsic/Option<T>/Result<T,E>
本文主要对RUST标准库的一些Trait代码做分析。如?号重载 Try Trait, 范围Range运算符重载,下标[]运算符重载等。另外,Iterator也是主要部分。
2022-01-31 11:17:51
1332
原创 深入RUST标准库内核(三)NonNull<T>/Unique<T>/mem::replace/Layout/GlobalAlloc
本节对rust 标准库的core::mem模块进行了代码分析。重点是MaybeUninit类型结构及结构体行为。
2022-01-21 10:29:08
2501
原创 深入RUST标准库内核(二)裸指针/MaybeUninit<T>
本节主要对RUST标准库中core::alloc, core::ptr做了若干代码分析。澄清一些核心的概念。
2022-01-19 11:12:07
2434
原创 深入RUST标准库内核(一)标准库内容概述
本文将研究RUST标准库的代码,力图揭示RUST编码的奥秘。本文不适合RUST的初学者,也不适合对RUST的内存安全模型无法理解的程序员。本文会给那些对RUST深感兴趣且已经入门,希望更好的提高RUST技巧的程序员巨大帮助。
2022-01-19 10:32:25
2735
1
原创 RUST生命周期浅析
struct TestLifetime <'a> 这句话是什么意思?答案是:如果你用struct TestLifetime声明了 test变量,那编译器会将test的生命周期标记成’a,你可以用用这个标记规定结构体内的变量的生命周期。struct TestLifetime <'a> {item: 'a &i32;}意思是如果定义了let i=5;let test= TestLifetime{&i};则 i 的必须活的不比test短,也即i的作用域要大于t
2021-09-18 07:50:35
363
原创 为什么需要创建型模式
举个例子,比如TCP/IP协议栈,最初我们只考虑主机本身就好了。后来出现了虚拟机的需求,需要多个独立的协议栈实体。如果程序最初是按照创建型模式设计的协议栈,那我们在虚拟机需求出现的时候,只需要简单的多创建协议栈的实体即可满足需求。如果没有用创建型模式,那协议栈的源代码将经历复杂的重构,测试,应用,排错过程。同样的例子也发生在路由协议适配VRF出现时的情况。所以,使用创建型模式就是为了适配日后未知的程序扩展,当变化来临时,你的程序架构已经做好了准备。可以在仅增加少量,必要的代码即可实现别人眼中非常巨大的需求
2021-02-06 20:20:11
151
原创 3G/4G/5G通信模块重启设计细节
无线通信模块本身实际是一个小网关,网关总是会因为各种原因崩溃的。在崩溃时,最后的保障就是重启,这个重启需要很多设计细节考虑。1.硬件上是需要硬件重启开关的,这是最后的一个保障。想试图利用软件狗重启整机进而使得模块重启无法生效,必须要整机硬重启才能使通信模块硬复位,从而从某些死机中恢复。整机硬重启对于运维人员来说就意味着现场操作。运维成本高昂且让问题显化。所以对模块的硬复位开关可以减少很多烦恼。2.应定时监测通信,在通信量较少的情况下尽可能的软复位模块。模块运行时间越长,越有可能发生非要硬复位不可的问题。
2021-02-06 10:10:29
1087
原创 面对对象杂谈
首先要了解为什么会出现面对对象。面对对象成为流行是从C++开始。C++是在C的基础上创建起来的。优秀的程序员已经形成了一整套如何用C设计出良好的程序结构的原则,使得C程序能够具备良好的可移植性,可维护性,可测试性,可伸缩性。但这套原则对于初出茅庐的程序员难以理解,沟通的成本过高。所以,创建一套内嵌这套原则的语言应该是个好主意。这套原则被起了个名字"面对对象",语言需要兼容C看起来也是个不错的主意。但“理想很丰满,现实很骨感”,C++太自由了,导致程序员仍然面临和C一样的面对对象学习曲线。实际上,面对对象本
2021-02-05 20:47:44
221
2
原创 FM无线数据传输协议细节
FM无线通信因为无线干扰大,而面向连接的传输方式协议复杂,所以很多时候用固定次数的重发完成干扰规避。重发的时候有一个细节可以优化传输效率,即每次重发的时候可以把新增的事件加入发送数据帧中。这样可以规避因为重发导致新增的事件被延迟发送,引起导致响应不及时。通常的FM无线通信不适合用于实时数据传输,因为太容易丢失信息。FM无线通信更适合传输一些数据丢失若干次也无所谓的系统,如胎压检测等,其优势是成本低且技术成熟。...
2021-02-05 10:55:08
1131
原创 无线吸尘器软件魔鬼细节
无线吸尘器的软件从规模上看不足1000行,但就这1000行代码中,魔鬼细节确不少。1.按键的锁机制,无线吸尘器的按键易误触,有时甚至是在货物运输途中被误触。这就需要对按键增加锁定及解锁机制。操作要不能反人类。2.电池管理主服务对象是马达,但如果有另一个用电单位如灯光照明,那要注意,一定要整体设置一个电池截止供电电压,否则灯光照明可能会把电池耗尽到充电电压以下,导致无法再充电。3.电池电量指示灯实际上是需要较复杂的算法来支持其正确工作的,如果仅仅用电池电压或充电电流做判断,那工作肯定不正常,尤其是考虑到
2021-02-03 07:15:25
158
原创 中断还是定时轮询
中断还是定时轮询中断实际上是温室里的花朵,看起来美,但真正处于复杂和极端的环境时,硬件可靠性非常值得怀疑。因此,只要计算力够,就建议采用轮询的方式。举个例子,曾经做过局端DSL驱动,因为电话线问题,DSL芯片不间断发出线路中断告警,导致CPU被中断淹没,这个问题最简单的方法是采用轮询,复杂一点的话对单位时间中断数设限,超过限制就将相关中断关掉。编程中任何一个系统外部信号的处理,第一反应就是如果这个信号不正常应该怎么办?这会带来非常多的创造性方法以及大量的工作量。但也可能会让你觉得换一个高性能硬件是最简单
2021-02-03 07:09:38
186
原创 Cisco VPP(vectors packets processing)中Vectors解析
Cisco VPP中vectors解析vectors 的本质外在表现为什么定义vectors结构总结Vectors的使用作为常规的内存操作来使用作为常用数据结构使用数组其他结构vectors 的本质外在表现很简单,实际上就是一个动态的可变大小数组。这个数组:每个元素的大小可以变化,数组大小可以变化。从而使得其可以作为任何数据结构的存储结构,事实上,VPP就是这样做的,所有数据结构的存储结...
2019-07-23 18:45:51
962
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人