自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 当C++遇到空指针异常......

在Java语言中,有空指针异常,在编程时为了代码安全,在遇到空指针时,防止程序崩溃,会捕捉空指针异常,即NullPointerException异常类。比如下面就是一段捕获NullPointerException异常的Java代码片段:try { 。。。。} catch (NullPointerException e) { e.printStackTrace();}当try语句块中的代码访问到空指针后,会抛出NullPointerException,随后在catch语句捕获这个异常,并

2022-04-28 18:24:49 8188 1

原创 C++11实现一个读写自旋锁-3(顺序锁 )

是一种特殊的读写锁,它也是一种乐观锁,我们知道,在读写锁中读写操作之间是互斥的,然而在顺序锁中,读写之间没有锁,写操作的时候无视读者的存在,但是读者在读数据时,要进行校验,验证在读数据期间数据没有被修改过,如果修改了,就放弃已经获取的数据,重新获取数据,也就是说读者总是假定它所读取的数据是正确的,是一种读乐观锁。同lock-free相比,它的关注点是读,只要在读的那一时刻,没有写操作,就认为能够都成功,读完之后再判断在读的过程中是否有写操作发生,如果有,则回滚,重新读。而lock-free更常见的是写操作,

2022-04-28 09:10:11 1202

原创 C++中调用虚函数都是动态绑定吗

多态在面向对象编程中是一个重要的概念,一般是使用虚函数来实现的,原理就是通过虚函数表保存了一个类的虚成员函数的指针,在调用虚函数时,可以通过对象的虚函数表指针来从虚函数表中得到函数指针,因为函数地址是通过函数指针来访问的,所以在编译时是不知道函数入口地址的,只能在运行时通过访问虚函数表来定位。为了方便分析说明,先定义几个有继承关系的类:// 基类class base {public: base() {} base(int) { foo(); } virtual void f

2022-03-17 17:36:19 1187

原创 C++中值语义的函数参数和返回值的背后

我们知道,在C++中对象作为数据传递时,如函数的参数传递和返回值,有值语义和引用语义的形式之说。当使用基本数据类型(如int、short、bool、指针、引用)进行传递时,实现非常简单,因为它们的值可以直接放入寄存器中,把寄存器作为参数传递和返回值的载体,就可以了,从一些函数调用约定就知道这些情况。可是,如果要传递的数据不是基本类型,而是用户定义的类型,比如class、struct等复合数据类型,这些类型的数据是无法放入一个寄存器的,那么在C++中是如果实现的呢。比如,我们有一个类,如下:class.

2022-03-17 11:26:32 1053

原创 C++11实现一个读写自旋锁-2

方案2class rw_spin_lock {public: rw_spin_lock() = default; ~rw_spin_lock() = default; rw_spin_lock(const rw_spin_lock&) = delete; rw_spin_lock &operator=(const rw_spin_lock&) = delete; void lock_reader() noexcept; void unlock_reader()

2021-12-21 10:21:33 259

原创 C++11实现一个读写自旋锁-1

本文介绍两种使用自旋锁方式实现读写锁的方案。方案一基本原理是使用一个原子变量作为计数器,如果该计数器的值大于0,说明有读者在持有读锁,它的值就是读者的数量,当计数器的值为-1时,说明有写者在持有写锁,如果计数器的值为0,则说明既没有读者持有读锁,也没有写锁持有写锁。所提供的接口有申请读锁,尝试申请读锁,释放读锁,申请写锁,尝试申请写锁,释放写锁等。定义读写锁rw_spin_lock类如下,它包含一个atomic_int类型的数据成员和六个申请锁、释放锁的成员函数,没有拷贝和移动语义。在实现时,要注意申

2021-12-16 21:34:08 1723

原创 C++11实现一个cyclic barrier

举个生活中的例子,假如有5个好基友,商量好周末一块去爬山,他们约定周日早上8点在山脚下集合,不见不散。周日那天,如果一个先到了,发现没有其他人到达,就只好等着,第二个人到了之后,发现还没有到期,也只能等待,直到第5个人到达后,所有5个人全部到齐了,就一起出发开始爬山。如果我们在脑海中想象有一个栅栏(barrier)立在山门口,如果它不拿走,人们是无法越过去的,它被拿走的条件是,5个基友全部到达。如果这5个基友哪怕仅有一个还没有到达,它也不会被放倒,基友就被拦在外面,只有当5个基友全部到达之后,这个栅栏才会陡

2021-12-15 21:26:26 1382

原创 C++11实现一个countdown latch

在日常生活中,我们经常遇到这样场景,当要做一件事情时,要先等待几个固定数目的其它事情做完了,才能进行,如果别的事情没有就绪,只能等待。比如,一个工厂有存放原材料的仓库,仓库的大门共有三把锁,分别由仓管员、主管部门经理和值班经理保管,当一个(或几个)领料员上班后去仓库领材料,发现仓库大门锁着,那么他就只能等着这三个掌管钥匙的人员来开门:如果主管部门经理来上班了,就把他负责的那把锁打开,然后去工作了,此时领料员只能继续等待,当值班经理来上班之后,把他负责的那把锁打开,然后也去工作了,只有最后仓管员上班之后打开最

2021-12-12 21:15:15 3128

原创 浅议C++回调函数的实现方式

引子-模板方法模式的实现看一下设计模式中模板方法模式的实现方式,首先定义一个模板基类,它有一个模板成员函数和一个钩子成员函数:class TemplateBase { int data; // 假设有一个int型的数据成员public: virtual ~TemplateBase() {} void process() { // 模板函数 // 其它准备操作 hook(); // 其它后续操作 } virtual void hook() {} // 钩子函数 // 其它

2021-11-30 09:34:47 1435 1

原创 智能指针之unique_ptr

unique_ptr用于独占它所指向的对象。某个时刻只能有一个unique_ptr指向一个给定的对象,也就是这个对象不会被多个unique_ptr同时共享,它只提供了移动语义,即它所管理的资源对象只能在unique_ptr之间进行移动,不能拷贝。资源对象的生命周期被唯一的一个unique_ptr托管着,一旦unique_ptr被销毁或者变成empty对象,或者拥有了另一个资源对象,它先前拥有的对象同时一并销毁,显然一旦对象离开unique_ptr的管理范围就会销毁,保证了内存不会泄露。下面看一下它的用法。

2021-11-12 16:45:25 12867 1

原创 构造函数和析构函数中调用虚函数是多态吗

在面向对象编程语言中,一个类的构造函数和析构函数是两个比较特殊的成员函数,它们主要用于对象的创建和销毁,和对象的生命周期息息相关,因此它们有着特殊的含义。编译器对待它们和其它普通的成员函数不一样,在编译它们时会添加一些额外的代码来做一些专门用途的业务逻辑。本文介绍其中一个和虚函数调用有关的场景及其实现机制。我们知道,C++为了实现面向对象的多态语义,设计了虚函数机制,具体地说,就是每个带有虚函数的类都会有一个虚函数表vtbl,在里面存放了各个虚函数的调用入口地址,在创建对象时,会为对象分配一个虚函数指针v

2021-11-09 16:50:59 737

原创 自旋锁的实现及优化

自旋锁的实现算法大多使用的是Test And Set算法,简称TAS,也就是先对目标值进行检查,如果目标符合预期的要求则同时把它修改为所需要的值。先介绍一下TAS原语,它的语义原型如下:function tas(p : pointer to bool) returns bool { bool value = *p if !*p { *p ←true } return value}它的语义是这样的:如果指针p指向的变量原值为false,就设置

2021-11-04 17:17:30 3658 3

原创 双重检查锁与单例模式

单例模式是比较常见的一种设计模式,它的实现方式有很多种,曾经见过一篇文章中列了十几种实现方式,比如饿汉式、懒汉式、双重检查锁、枚举。。。等等,大家也应该非常熟悉常见的实现方式,本文简单的谈谈其中的“双重检查锁”实现方式。我们知道单例模式的对象在进程中仅有一份,在多线程环境下为了防止创建出多个对象,需要对创建对象的过程进行互斥操作,这样,当多线程同时竞争时,保证只能由一个线程来创建唯一对象。互斥操作方式常见的就是锁,比如互斥锁或者自旋锁。下面的C++代码片段就是使用mutex锁来实现的,原理大家都明白,就不

2021-10-26 18:38:09 2257

原创 Android中的设计模式-职责链模式

在介绍该模式之前,先提一个问题,下图是SQL语句select执行时结果集的流转图,如果让你编写解析该select语句的代码,你会怎样设计方案呢?因为在select语句中,有些字段不一定出现,如group、limit、where等,因此,肯定不能按照固定的语句格式来解析,最常见的方式可能就是,使用大量的if。。else if。。else if。。else。。语句,根据select中实际出现的字段去调...

2018-05-22 13:38:55 435

原创 Android中的设计模式-享元模式

我们在编程实践中,经常会遇到这样的场景:许多类或方法中,用到了一些代码模块,这些代码的逻辑结构完全一样。那么我们一般会对这些代码进行重构,把这些代码抽取出来,组成一个新的方法,并把它放到基类或者工具类中,作为通用方法,这样各个不同的类或方法能同时使用它们来完成功能,显然,这种方式提高了代码的复用性,减少了代码的数量。这个场景就是典型的享元模式场景。该模式的定义非常简单: 运用共享技术有...

2018-05-18 14:24:59 573

原创 Android中的设计模式-桥梁模式

“假舆马者,非利足也,而致千里;假舟楫者,非能水也,而绝江河。君子生非异也,善假于物也。”——荀子《劝学》。 美国好莱坞电影有《蜘蛛侠》、《蝙蝠侠》,无非就是让人具有了某种动物的能力,从而“能力越大、责任越大”,如果换成面向对象术语的话,就是“人”类继承了“蜘蛛”类和“蝙蝠”类,从而具有了它们的功能。按照这个思路发展,如果人类要想渡海过江,就得继承鱼类,人类要想远行,就得继承马类,于是电影《鲨鱼...

2018-05-16 14:49:10 602 1

原创 Android中的设计模式-命令模式

两位大侠均系出名门,适配器大侠身为结构教长老,而策略大侠位居行为派护法。二侠虽然门派不同,素昧平生,却也一见如故,把酒言欢之余,心意相通,准备合奏一曲助兴。只见适配器大侠使出乾坤大挪移,无论何种乐器,或吹、或拉、或弹、或敲,不管音调如何,或轻、或重、或缓、或急,都被他一一化解为一种和音,无不处处落在策略大侠的旋律上。丝丝入扣,不差毫厘,冥冥之中自有天意,“适配器”大侠与“策略”大侠竟然合成了一首《...

2018-05-16 13:10:27 295

原创 Android中的设计模式-备忘录模式

公元1722年,康熙皇帝驾崩于北京畅春园,步军统领隆科多取出了藏在正大光明匾额后面的遗诏,宣布四阿哥胤禛克承大统,继承皇位,天朝帝国从此走进了新时代。康熙为什么采用遗诏,而不是自己宣布继承人?还不是为了防止出现意外:躲猫猫、马航370、相亲遇到翟欣欣、被闺蜜锁在门外…;别人能够知道和篡改遗诏的内容吗?别人敢吗?!这样康熙使用遗诏的方式,在龙驭宾天后,恢复了“皇帝类”的另一个对象实例:雍正。康熙爷在...

2018-05-16 10:33:23 835

原创 Android中的设计模式-观察者模式

沛公军霸上,未得与项羽相见。沛公左司马曹无伤使人言于项羽曰:“沛公欲王关中,使子婴为相,珍宝尽有之。”项羽大怒曰:“旦日飨士卒,为击破沛公军!”……项伯乃夜驰之沛公军。——《史记·项羽本纪》 曹无伤是项羽安插在刘邦身旁的“卧底”,也就是项羽向刘邦注册的一个“观察者”,在“主题”刘邦状态改变时:“沛公欲王关中”,向“订购者”项羽发送通知:“使人言于项羽”。 不过,虽然鸿门宴上杀机重重,但刘邦最后...

2018-05-15 14:33:47 212

原创 Android中的设计模式-模板方法模式

“浓眉大眼好干部,尖嘴猴腮狗特务,好人机枪打不死,坏蛋一枪就玩完!”,拍摄革命题材电影是有套路(模板)的,每当共产党员中枪了,要牺牲在战友怀中的时候,我们知道此时该有经典场景了:有的电影是“部队和群众都安全转移了吗?”,有的电影是“这是我的党费”,。。。不管哪种形式,用在这个场景肯定合适,然后就安详地闭上了双眼。这就是模板方法模式在电影中的应用,它是属于行为型: 在一个方法中定义一个算...

2018-05-15 14:16:19 538

原创 Android中的设计模式-策略模式

大道至简,越是简单就越接近事物的本质。策略模式是非常简单的一个模式,属于行为型模式。 定义一系列的算法,把它们一个个封装起来,而且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。下面是它的结构类图: - 策略接口(Strategy):定义所有算法的公共接口。Context使用这些接口来调用具体的策略类。 - 具体的策略实现(Concrete Strate...

2018-05-15 13:29:16 463

原创 Android常见优化方式-避开高峰期

现在随着私家车越来越多,交通阻塞成为家常便饭,为了缓解交通压力,一些城市采取了交通限行方式,比如北京禁止外地牌照的汽车在工作日期间早晚高峰期进入五环,等到车流高峰期过去之后再上路。如果把Android应用程序比作是一座城市的话,把CPU和内存等资源看作是城市的交通道路,把组成应用程序的各个功能模块,比如UI、后台服务、等看作是汽车,它们运行的时候看作是汽车上路行驶。那么我们编程实践时,...

2018-05-15 12:34:43 286

原创 Android常见架构模式-依赖注入模式

我们来设想一下使用Android框架来实现UI界面,应该是什么样的过程。正常的思路可能是这样的:首先要为Android框架定义一个派生类,如Activity的子类,或者实现一个接口类,如View类定义的OnXxxListener()接口类;其次,创建这些类的对象实例;接着,把对象实例注册到框架中去;最后,由框架根据需要调用这些应用层实现的接口方法。涉及到应用层的操作共有三个步骤:1、定义类...

2018-05-15 10:20:49 1356

原创 Android常见架构模式-反向控制模式

我们在编写应用程序时,经常使用代码库(Library)和框架(Framework)。代码库是一组静态代码的集合,一般是没有状态的,模块和模块之间也没有关联,都是独立的,应用程序在使用代码库提供的功能时,直接调用就行了,库都是被动的,不会参与或控制应用程序的业务流程;而框架与代码库有所不同,它有两个典型性的特征:一是通过扩展而不是修改框架来添加新功能(OCP原则),二是使用框架实现的应用程序控制流由...

2018-05-15 09:48:50 1471

原创 Android常见优化方式-SparseArray

        在Android应用开发SDK中,有一个SparseArray类实现了HashMap的相似功能,如果key值的类型是int时,可以使用它来替代HashMap,以达到节省内存的目的。SparseArray采用的是有序数组来保持数据,而且是两个有序数组,一个用于保存int型的key值的数组keys,另一个用于保存value值的数组values,key值和value值在两个数组中的位置是...

2018-05-11 14:08:04 721

空空如也

空空如也

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

TA关注的人

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