自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(137)
  • 资源 (5)
  • 收藏
  • 关注

原创 C++内存模型

C++内存分为5个区域:栈(Stack): 栈的内存地址是连续的且被一一记录的。内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。栈运算分配内置于处理器的指令集中,效率很高,但是分配的内存容量有限。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。堆(Heap ): 由new分配的内存块,其释放编译器不去管,由我们程序自己控制,一个new对应一个delete,或者一个new[] 对应一个delete[]。如果...

2021-02-17 14:56:43 197 1

原创 Android ScreenSaver分析

Android屏保启动接口:https://blog.csdn.net/szqsdq/article/details/74237967https://blog.csdn.net/weixin_42695485/article/details/81462877屏保提供了对外接口:IDreamManager mDreamManager = IDreamManager.Stub.asInterface(ServiceManager.getService(DreamService....

2021-01-31 12:44:38 1823

原创 Android Handler机制

Android开发中经常用到handler来发送消息,比如将消息抛到主线程去更新UI。handler机制涉及到三个核心的类:Looper:消息循环,不断从消息队列中取出消息; MessageQuenue:消息队列; Handler:管理消息队列; 为了更好的理解这三者的关系,我们可以想象成现实生活中,工厂里边的一条流水线。有一个放产品(Message)的传送带(MessageQuenue),被机器带动起来不断循环运行(Looper),而工人(Handler)需要将产品...

2021-01-10 18:56:00 202

原创 Java锁机制

Java锁主要是为了解决线程安全问题,当多个线程共享同一个变量时可能会出现同时修改变量的情况,这样会导致最终计算结果错误。未解决该问题,Java提供了各种锁来确保数据能够被正常修改和访问。最常用的比如synchronized。一、互斥同步 互斥同步是最常见的一种并发正确性保障手段,同步是指多个线程并发访问共享数据是,保证共享数据在同一个时刻只被一条线程使用。Java中,最基本的互斥同步手段就是synchronized关键字,该关键字经过编译之后,会在同步块的前后分别形成...

2020-12-31 21:17:34 129

原创 Java垃圾回收机制

Java自动内存管理归结为内存分配和内存回收。内存回收有如下算法。一、根搜索算法原理:通过一系列名为“GC Roots的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象时不可用的。 上述不可达的对象,并非立即宣告死亡,至少需要经历两次标记过程:对象进行根搜索后发现没有与GC Roots相连接的引用链,则会被第一次标记并且进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法。如果对...

2020-12-20 14:32:16 120 1

原创 volatile关键字

回顾之前Java内存模型特征可以了解到该模型是围绕着并发过程中如何处理原子性、可见性和有序性这三个特征来建立的。 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行。Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六个,如果应用场景需要更大范围的原子性保证,Java内存模型还提供了lock和unlock操作来满足需求,比如synchronize关键字。在synchronize块之间的操作...

2020-12-13 17:32:42 118 1

原创 Java内存模型

Android开发中,存在大量并发的情况,因此也会遇到很多线程安全问题,在查询线程安全相关资料时,通常会查到Java内存模型的知识点。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。为了获得较好的执行效能,Java内存模型并没有限制执行引擎使用处理器的特定寄存器或缓存来和主内存进行交互,也没有限制即时编译器调整代码执行顺序这类权利。 Java内存模型规定了所有的变量都存储在主内存中。每条线程有自己的工作...

2020-12-06 12:19:24 91

原创 JVM内存区域划分

Java虚拟机在执行Java程序过程中会把它所管理的内存划分为以下区域: 程序计数器:一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里,字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处...

2020-11-29 14:21:12 218

原创 面向对象设计原则——迪米特法则

迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。 如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。迪米特法则还有几种定义形式,包括:不要和“陌生人”说话、只与你的直接朋友通信等,在迪米特法则中,对于一个对象,其朋友包括以下几...

2020-11-22 10:21:52 150

原创 面向对象设计原则——单一职责原则

单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。 单一职责原则(Single Responsibility Principle,SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。 单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能...

2020-11-22 10:14:51 122

原创 面向对象设计原则——合成复用原则

合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, C/ARP),定义:尽量使用对象组合,而不是继承来达到复用的目的。 合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用功能的目的。简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承。 在面向对象设计中,可以通过两种方法在不同的环...

2020-11-15 09:58:07 197

原创 面向对象设计原则——接口隔离原则

接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。 根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。这里的“接口”往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言...

2020-11-15 09:52:27 135

原创 面向对象设计原则——里氏代换原则

里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。 里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。例如:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。 例如有...

2020-11-08 08:51:15 755

原创 XXX iPhone has denied the launch request

在Xcode运行 应用的时候,出现 iPhone has denied the launch request.这个问题。目前我遇到的原因是:Signing 需要重新配置一下,重新选一下Automatically manage signing。就OK了。

2020-11-01 11:49:51 130

原创 面向对象设计原则——依赖倒置原则

如果说开闭原则是面向对象设计的目标的话,那么依赖倒置原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。 依赖倒置原则定义: 抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。 依赖倒置原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。为了确保该原则的应用,一个具体...

2020-11-01 11:47:11 285

原创 面向对象设计原则——开闭原则

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand Meyer于1988年提出。 定义:开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。 在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。 任何软件都需要面临一个很重要的问题,即它们的需求会随时间的...

2020-10-25 10:12:44 375

原创 QTcrash 查询方法

c++filt _ZN26NGLatestHistroyList_PluginC1Ev(指定是具体crash的信息)

2020-10-18 11:19:31 222

原创 不要轻忽编译器的警告——条款53

许多程序员习惯性地忽略编译器警告。他们认为,毕竟,如果问题很严重,编译器应该给一个错误信息而非警告信息,不是吗?这种想法对其他语言或许相对无害,但在C++,我敢打赌编译器作者对于将会发生的事情比你有更好的领悟。例如:class B {public: virtual void f() const;};class D: public B {public: virtual void f();}; 这里希望以D::f重新定义virtual函数B::f...

2020-10-11 13:54:03 200

原创 写了placement new也要写placement delete——条款52

placementnew和placementdelete并非C++兽栏中最常见的动物,如果你不熟悉它们,不要感到挫折或忧虑。回忆条款16和17,当你写一个new表达式像这样:Widget* pw = new Widget;共有两个函数被调用:一个是用以分配内存的operatornew,一个是Widget的default构造函数。 假设其中第一个函数调用成功,第二个函数却抛出异常。既然这样,步骤一的内存分配所得必须取消并恢复旧观,否则会造成内存泄漏。在这个时候...

2020-10-03 11:32:12 242

原创 编写new和delete时需固守常规——条款51

条款50已解释什么时候你会想要写个自己的operatornew和operatordelete,但并没有解释当你那么做时必须遵守什么规则。这些规则不难奉行,但其中一些并不直观,所以知道它们究竟是些什么很重要。 让我们从operatornew开始。实现一致性operatornew必须得返回正确的值,内存不足时必得调用new-handling函数(见条款 49),必须有对付零内存需求的准备,还需避免不慎掩盖正常形式的new——虽然比较偏近class的接口要求而非实现要求。...

2020-09-29 21:39:28 147

原创 了解new和delete的合理替换时机——条款50

让我们暂时回到根本原理。首先怎么会有人想要替换编译器提供的operatornew或operatordelete呢?下面是三个最常见的理由:用来检测运用上的错误。如果将“new所得内存”delete掉却不幸失败,会导致内存泄漏(memoryleaks)。如果在“new所得内存”身上多次delete则会导致不确定行为。如果operatornew持有一串动态分配所得地址,而operatordelete将地址从中移走,倒是很容易检测出上述错误用法。 为了强化效能。编译器所带的oper...

2020-09-20 10:41:24 187

原创 了解new-handler的行为——条款49

operatornew无法满足某一内存分配需求时,它会抛出异常。以前它会返回一个null指针,某些旧式编译器目前也还那么做。你还是可以取得旧行为,但本条款最后才会进行这项讨论。 当operatornew抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler。为了指定这个“用以处理内存不足”的函数,客户必须调用set_new_handler,那是声明于<new>的标准程序库函数:namespace...

2020-09-13 12:10:36 134

原创 需要类型转换时请为模板定义非成员函数——条款46

条款24讨论过为什么唯有non-member函数才有能力“在所有实参身上实施隐式类型转换”,该条款并以Rationalclass的operator*函数为例。我强烈建议你继续看下去之前先让自己熟稔那个例子,因为本条款首先以一个看似无害的改动扩充条款24的讨论:本条款将Rational和operator*模板化了:template<typename T> class Rational { public: Rational(const T&am...

2020-09-06 12:31:45 208 1

原创 运用成员函数模板接受所有兼容类型——条款45

所谓智能指针是“行为像指针”的对象,并提供指针没有的机能。例如条款13曾经提及std::auto_ptr和tr1::shared_ptr如何能够被用来在正确时机自动删除heap-based资源。STL容器的迭代器几乎总是智能指针;无疑地你不会奢望使用“++”将一个内置指针从linkedlist的某个节点移到另一个节点,但这在list::iterators身上办得到。 真实指针做得很好的一件事是,支持隐式转换。Derivedclass指针可以隐式转换为baseclass...

2020-08-30 11:08:24 191

原创 将与参数无关的代码抽离templates——条款44

Templates是节省时间和避免代码重复的一个奇方妙法。不再需要键入20个类似的classes而每一个带有15个成员函数,你只需键入一个classtemplate,留给编译器去具现化那20个你需要的相关classes和300个函数。(classtemplates的成员函数只有在被使用时才被暗中具现化,所以只有在这300个函数的每一个都被使用,你才会获得这300个函数。)Functiontemplates有类似的诉求。替换写许多函数,你只需要写一个functiontemplates,...

2020-08-23 22:19:25 234

原创 学习处理模板化基类内的名称——条款43

假设我们需要撰写一个程序,它能够传送信息到若干不同的公司去。信息要不译成密码,要不就是未经加工的文字。如果编译期间我们有足够信息来决定哪一个信息传至哪一家公司,就可以采用基于template的解法:class CompanyA {public: ... void sendCleartext(const std::string& msg); void sendEncrypted(const std::string& msg); ...}...

2020-08-16 11:08:20 167

原创 了解typename的双重意义——条款42

提一个问题:以下template声明式中,class和typename有什么不同?template<class T> class Widget; //使用"class"template<typenameT> class Widget; //使用"typename" 答案:没有不同。当我们声明template类型参数,class和typename的意义完全相同。某些程序员始终比较喜欢class,因为可以少打几个字。其他人比较喜欢typena...

2020-08-09 11:03:22 150

原创 了解隐式接口和编译期多态——条款41

面向对象变成世界总是以显式接口(explicit interfaces)和运行期多态(runtime polymorphism)解决问题。举个例子,给定这样(无甚意义)的class:class Widget {public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap(Widget& ...

2020-08-02 15:20:25 179

原创 明智而审慎地使用多重继承——条款40

当多重继承(multiple inheritance;MI)进入设计景框,程序有可能从一个以上的base classes继承相同名称(如函数、typedef等等)。那会导致较多的歧义机会。例如:class BorrowableItem { // 图书馆允许你借某些东西public: void checkOut(); // 离开时进行检查 ...};class ElectronicGadget {private: bool...

2020-07-26 15:35:08 199

原创 明智而审慎地使用private继承——条款39

条款32曾经论证过C++如何将public继承视为is-a关系。在那个例子中我们有个继承体系,其中class Student以public形式继承class Person,于是编译器在必要时刻(为了让函数调用成功)将Students暗自转换为Persons。现在我们再重复该例的一部分,并以private继承替换public继承:class Person { ... };class Student:private Person { ... }; // 这次改用private继承...

2020-07-19 09:41:08 189

原创 通过复合塑模出has-a或“根据某物实现出”——条款38

复合(composition)是类型之间的一种关系,当某种类型的对象内含它种类型的对象,便是这种关系。例如:class Address { ... }; // 某人的住址class PhoneNumber { ... };class Person {public: ...private: std::string name; // 合成成分物(composed object) Address address; // 同...

2020-07-12 10:02:12 258

原创 绝不重新定义继承而来的缺省参数值——条款37

让我们一开始就将讨论简单化。你只能继承两种函数:virtual和non-virtual函数。然而重新定义继承而来的non-virtual函数永远是错误的(见条款36),所以我们可以安全地将本条款的讨论局限于“继承一个带有缺省参数值的virtual函数”。 这种情况下,本条款成立的理由就非常直接而明确了:virtual函数系动态绑定(dynamically bound),而缺省参数值却是静态绑定(statically bound)。 对象的所谓静态类型(st...

2020-07-06 21:28:11 291

原创 绝不重新定义继承而来的non-virtual函数——条款36

假设我告诉你,class D系有class B以public形式派生而来,class B定义有一个public成员函数mf。由于mf的参数和返回值都不重要,所以我假设两者皆为void。换句话说我的意思是:class B {public: void mf(); ...};class D: public B { ... }; 虽然我们对B,D和mf一无所知,但面对一个类型为D的对象x:D x; // x是一个类型为D的对象 如果以下行为...

2020-06-27 17:33:41 381 1

原创 考虑virtual函数以外的其他选择——条款35

假设你正在写一个视频游戏软件,你打算为游戏内的人物设计一个继承体系。你的游戏术语暴力砍杀类型,剧中人物被伤害或因其他因素而降低健康状态的情况并不罕见。你因此决定提供一个成员函数healthValue,它会返回一个整数,表示人物的健康程度。由于不同的人物可能以不同的方式计算他们的健康指数,将healthValue声明为virtual似乎是再明白不过的做法:class GameCharacter {public: virtual int healthValue() const; //...

2020-06-26 13:53:04 226

原创 区分接口继承和实现继承——条款34

表面上直截了当的public继承概念,经过严密的检查之后,发现它由两部分组成:函数接口(function interfaces)继承和函数实现(function implementations)继承。这两种继承的差异,很像本书导读所讨论的函数声明与函数定义之间的差异。身为class设计者,有时候你回希望derived classes只继承成员函数的接口(也就是声明);有时候你又希望derived classes同时继承函数的接口和实现,但又希望能够覆写(override)它们所继承的实现;有时候你希望de

2020-06-17 21:34:49 218

原创 避免遮掩继承而来的名称——条款33

这个题材和继承无关,而是和作用域有关,我们都知道在诸如这般的代码中:int x; // global变量void someFunc(){ double x; // local变量 std::cin >> x; // 读一个新值赋予local变量x} 这个读取数据的语句指涉的是local变量x,而不是global变量x,因为内层作用域的名称会遮掩外围作用域的名称。我们可以这样看本列的作用域形式:...

2020-06-07 10:45:56 180

原创 确定你的public继承塑模出is-a关系——条款32

如果你令class D(“Derived”)以public形式继承class B(“Base”),你便是告诉C++编译器(以及你的代码读者)说,每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。你的意识是B比D表现出更一般化的概念,而D比B表现出更特殊化的概念。你主张“B对象可派上用场的任何地方,D对象一样可以派上用场”,因为每一个D对象都是一种B对象。反之如果你需要一个D对象,B对象无法效劳,虽然每个D对象都是一个B对象,反之并不成立。 C++对于“publ...

2020-05-30 10:15:34 279

原创 将文件间的编译依存关系降至最低——条款31

假设你对C++程序的某个class实现文件做了些轻微修改。注意,修改的不是class接口,而是实现,而且只改private成分。然后重新建置这个程序,并预计只花数秒就好。毕竟只有一个class被修改。你按下“Build”按钮或键入make(或其它类似命令),然后大吃一惊,然后感到窘困,因为你意识到整个世界都被重新编译和连接了!当这种事情发生,难道你不气恼吗? 问题出在C++并没有把“将接口从实现中分离”这事做得很好。Class的定义式不只详细叙述了class接口,还包括十足...

2020-05-26 22:02:34 257

原创 透彻了解inlining的里里外外——条款30

Inline函数,多棒的点子!它们看起来像函数,动作像函数,比宏好得多(见条款2),可以调用它们又不需要蒙受函数调用所招致的额外开销。你还能要求更多吗? 你实际获得的比想到的还多,因为“免除函数调用成本”只是故事的一部分而已。编译器最优化机制通常被设计用来浓缩那些“不含函数”调用的代码,所以当你inline某个函数,或许编译器就因此有能力对它(函数本体)执行语境相关最优化。 然而编写程序就像现实生活一样,没有白吃的午餐。inline函数也不例外。inlin...

2020-05-17 11:28:28 243

原创 为“异常安全”而努力是值得的——条款29

异常安全性(Exception safety)有几分像是......呃......怀孕。但等等,在我们完成求偶之前,实在无法确定地谈论生育。 假设有个class用来表现夹带背景图案的GUI菜单。这个class希望用于多线程环境,所以它有个互斥器(mutex)作为并发控制(concurrency control)只用:class PrettyMenu {public: ... void changeBackground(std::istream& imgS...

2020-05-16 09:09:56 249

unique_ptr源码

该文档是C++ auto_ptr源码,感兴趣的可以自行下载学习,方便大家学习参考。

2019-02-28

C++ auto_ptr源码

该文档是C++ auto_ptr源码,感兴趣的可以自行下载学习。

2019-02-27

智能指针与引用计数详解

该demo主要展现智能指针和引用计数的实现过程,总共两个类,一个智能指针类,一个引用计数类,另外附一份执行步骤资料

2018-12-10

Ubuntu有线连接驱动包

Ubuntu有线连接驱动包,解决网络连接问题

2017-03-24

FindBugs安装包

这是最新版本findbugs工具的安装包

2015-09-18

空空如也

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

TA关注的人

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