自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【设计模式】结构型模式之组合Composite

组合Composite是一种对象结构型设计模式,意在将对象组合成树形结构以表示部分与整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。当我们想表示对象的部分与整体层次结构时,或者希望用户忽略组合对象与单个对象的不同,能够统一地使用组合结构中的所有对象时,我们可以使用Composite模式。Composite模式的结构如下类图所示:上图中,Component为组合中的对象声明接口,在适当的

2016-08-07 17:46:09 897 3

原创 【设计模式】结构型模式之桥接Bridge

**桥接Bridge**是一种对象结构型设计模式,意在将抽象部分与它的实现部分分离,使它们都可以独立地变化。 Bridge模式的结构如下图所示: 上图中,Abstraction定义抽象类的接口,维护一个指向Implementor类型对象的指针;RefinedAbstraction扩充由Abstraction定义的接口;Implementor定义实现类的接口,该接口不一定要与Abstr

2016-08-07 11:21:34 673

原创 【设计模式】结构型模式之适配器Adaptor

适配器Adaptor是一种结构型设计模式,目的是把一个类的接口转换成客户希望的另外一个接口,对接口进行包装,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。设想这么几种情况,当我们想使用一个已经存在的类,而这个类的接口不符合需求时,或者当我们想创建一个可以复用的类,这个类可以与其它不相关的类或不可预见的类协同工作时,或者当我们想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它

2016-07-31 17:37:53 939

原创 【设计模式】创建型模式之原型Prototype

原型Prototype是一种创建型设计模式,意在用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型Prototype是一种创建型设计模式,意在用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。当一个系统应该独立于它的产品创建、构成和表示时,或者当要实例化的类是运行时刻指定时,或者为了避免创建一个与产品类层次平行的工厂类层次时,或者当一个类的实例只能有几个不同状态组合中

2016-05-29 20:38:17 938

原创 【设计模式】创建型模式之工厂方法Factory Method

工厂方法Factory Method是一种创建型设计意在定义一个用于创建对象的接口,让子类决定实例化哪一个类,也就使得一个类的实例化延迟到其子类。当一个类不知道它所必须创建的对象的类的时候,或者当一个类希望由它的子类来指定它所创建的对象的时候,或者当类将对象的职责委托给多个帮助子类中某一个并且希望将哪一个帮助子类是代理者这一信息局部化的时候,就可以使用工厂方法模式。工厂方法的类图如下:

2016-05-29 16:13:23 1160

原创 【设计模式】创建型模式之生成器Builder

生成器Builder是一种创建型设计模式,意在将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 下面是Builder模式的类图—— Builder:为创建一个Product对象的各个部件指定抽象接口。 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。 Director:构造一个

2016-05-24 09:47:43 1018

原创 【设计模式】创建型模式之抽象工厂Abstract Factory

抽象工厂Abstract Factory是一种创建型设计模式,目的在于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂的类图如下,客户仅与抽象类定义的定义的接口交互,而不使用特定的具体类的接口。一个系统包含多种产品时,AbstractFactory声明创建各种抽象产品对象的操作接口,这些接口是直接暴露给Client的,而具体产品对象的创建则延迟到子类ConcreteFac

2016-05-08 18:25:10 2578

原创 【设计模式】创建型模式之单例Singleton

在设计模式中,单例Singleton是一种简单、常用的创建型模式,它的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点,下面以C++为例说明单例的使用。1、一个简单的单例一个最一般的单例类图如下所示:如下Singleton类,使用了单例模式,仅仅对外部提供了一个访问接口,即public权限的静态成员函数Instance,与之相关联的是一个private权限的静态成员变量,用来保存唯一的类实

2016-05-02 21:16:37 1190

原创 【Bash百宝箱】Android envsetup.sh及lunch

在Android开发环境中编译一个目标时,一般要执行下面三行命令:$ . build/envsetup.sh$ lunch <product_name>-<build_variant>$ make [module]这三行命令是什么意思呢?下面逐一介绍。1、envsetup.shenvsetup.sh是个shell脚本,位于build目录下,第一行命令便是执行这个脚本。执行脚本有多种方式,那为什么

2016-04-12 13:09:33 2144

原创 【Bash百宝箱】shell中如何进行数学运算

在shell中进行数学运算时有其特殊的语法,不同于其它编程语言,比如说加法,仅仅简单的使用一个加号+是不够的,下面是两种错误的使用方式。错误1——$ num1=3;num2=4$ sum=num1+num2$ echo $num1 $num2 $sum结果显示:3 4 num1+num2首先要注意的是,shell中变量赋值=的两边不能有空格。加法运算出错,只是把两个变量名拼起来了,有人说访问变量

2016-04-08 12:16:59 3604

原创 【IPC】Posix共享内存区与mmap内存映射

共享内存是一种IPC形式,与其它IPC机制如管道、消息队列等相比,数据不必在进程与内核间多次交换,进程间通信的速度更快。当共享内存区映射到共享它的进程的地址空间时,再加以一些同步控制,这些进程就可以进行数据传送了。mmap函数提供了内存映射功能,可以把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间,下面首先介绍mmap的用法。1、mmapinclude <sys/mman.h>vo

2016-03-30 19:56:23 3229

原创 【IPC】Posix信号灯

信号灯semaphore是一种进程间或者线程间的同步原语,有以下三种形式——Posix有名信号灯:使用Posix IPC名字标识,相关函数为sem_open/sem_close/sem_unlink,可用于进程或线程间的同步。 Posix基于内存的信号灯:存放在共享内存区中,相关函数为sem_init/sem_destroy,可用于进程或线程间的同步。 System V信号灯:在内核中维护,可用

2016-03-23 18:33:29 1276 1

原创 【IPC】 记录锁

记录锁控制函数fcntl,可用于有亲缘关系或无亲缘关系的进程间共享某个文件的读与写,共享文件通过文件描述符来访问,这种类型的锁通常在内核中维护,其唯一标识即fcntl函数调用进程的pid。先以一个例子说明进程间文件共享的问题。// nolock.c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.

2016-03-22 19:44:21 847

原创 【IPC】读写锁

读写锁是同步的又一种形式,与互斥锁不同,互斥锁同时只能被一个线程获取,而读写锁可以同时被多个线程获取读锁,这在一定程度上提高了程序的并发性,写锁也同样是只能被一个线程获取。读写锁的数据类型为pthread_rwlock_t,静态分配时可初始化为PTHREAD_RWLOCK_INITIALIZER,动态分配时调用函数pthread_rwlock_init完成。下面是获取与释放读写锁的几个函数。#inc

2016-03-21 18:03:18 1248

原创 【IPC】互斥锁与条件变量及生产者-消费者问题

在多线程或者多进程之间共享数据时,同步是必需的,一个可行的方法是使用互斥锁与条件变量,这是一种最基本的同步形式,下面介绍其用法及在经典同步问题“生产者-消费者问题”中的应用。1、生产者-消费者问题(一)生产者-消费者问题是个经典的同步问题,也称为有界缓冲区问题,生产者、消费者代表某个线程或进程,生产者负责生产数据,消费者则对这些数据进行处理,数据是共享的,当有多个生产者或消费者时,同步会显得非常重要

2016-03-17 20:26:31 3170 1

原创 【IPC】Posix消息队列

消息队列是一种IPC机制,有Posix消息队列和System V消息队列两种类型,它们有许多相似之处,但也有一些差别:对Posix消息队列的读总是返回优先级最高的最早的消息,而对System V消息队列的读则可以返回任意指定优先级的消息;当往空队列放置消息时,Posix消息队列允许产生一个信号或启动一个线程,而System V消息队列则不能提供类似的机制。消息队列可认为是一个消息链表,队列中的每个消

2016-03-11 19:53:52 1096

原创 【IPC】管道和FIFO

UNIX IPC有多种形式,最初使用的便是管道pipe,管道没有名字,又称匿名管道,一般用于有亲缘关系的进程间通信,后来出现了fifo这种管道,它是有名字的,又叫做有名管道,可用于无亲缘关系的进程间通信,这两种管道的数据传输都可以使用我们最熟悉的write、read函数来完成。1、管道pipe创建管道使用如下pipe函数:#include <unistd.h>int pipe(int pipefd

2016-03-04 21:27:29 1018

原创 【Java】JNI简单用法

JNI即Java Native Interface,是Java与本地代码(多指C/C++)交互的机制。Java是平台无关的,移植性强,但有时候由于特殊原因,需要与本地接口交互,也就是说在Java中调用C/C++函数,或者在C/C++中调用Java接口,下面介绍其实现方法。如何在Java中调用native方法?1、在Java中声明native方法与普通的Java方法类似,只不过这个方法需要使用nati

2016-01-19 12:15:15 1379

原创 【C++】Android中的同步机制

在涉及多线程、多进程编程时,同步问题是不可避免的。在不同的操作系统或者项目中,都有自独特的同步手法,不过同步原理基本相同。在Android系统中,封装了几个同步类,下面来看一下这些同步类的源码是如何实现的。1、MutexMutex是个互斥锁,即MUTual EXclusion,对pthread的mutex进行了简单的封装,内部还有个嵌套类AutoLock,从名字上就可以看出这个类的功能是自动加锁解锁

2016-01-15 17:34:00 3565

原创 【Bash百宝箱】Android编译系统(Makefile)

MakefileAndroid编译系统基于GNU make,用来管理Makefile,Makefile的基础知识可参考: http://blog.csdn.net/ieearth/article/details/47296429Makefile最一般的规则就是个依赖树,如下:target: prerequisites commandstarget是我们编译时要生成的目标,prerequis

2016-01-13 14:33:08 1858

原创 【Bash百宝箱】Android源码下载及编译

版本管理在分析Android源码之前,首先要了解一下相关的版本管理工具。Git工具是一种分布式的版本管理系统,最初被设计用于Linux内核的版本控制。Git功能强大,但也有之不便之处,Android中有许多项目,用git来统一管理就显得力不从心了,为此Google用Python开发了一套专门用来管理整个Android系统的工具repo。使用repo的基本流程——a. 使用repo init创建分支。

2016-01-08 19:09:43 1554

原创 【Arch】Android系统简介

Google IO下面是Google IO的logo(IO是什么意思?网上有几个不同版本的解释)——Google IO是由Google举办的网络开发者大会,旨在讨论用Google和开放网络技术去开发网络应用。Google IO大会从2008年开始,在美国加州旧金山每年举行一次。2015年的Google IO大会重点发布了三大智能平台,包括移动端、可穿戴设备和物联网。移动端—— 全新的移动端平台An

2016-01-06 18:09:20 1472

原创 【XML】XML - Schema

Xml Schema类似于DTD,定义了XML文档的逻辑结构,基本功能如下:a、定义可出现在文档中的元素及元素属性。 b、定义哪个元素是子元素。 c、定义子元素的次序及数目。 d、定义元素是否为空,即是否可包含文本。 e、定义元素和属性的数据类型。 f、定义元素和属性的默认值以及固定值。Xml Schema也称做Xml Schema Definition,即XSD,schema为其根元素,

2016-01-04 15:11:56 962

原创 【XML】XML - DTD

DTD即Document Type Definition文档类型定义,规定了XML文档的逻辑结构,可在XML文档中声明,也可作为一个外部引用。通过DTD,我们可以知道XML文档的格式,也可以用来验证所传输数据的格式是否正确。1、在XML文档内部声明DTD——DTD可以直接在XML文档内部声明,语法格式如下:&lt;!DOCTYPE root-element [element-declaration]&gt;DO

2015-12-30 13:19:05 789

原创 【XML】XML基础知识

XML即eXtensible Makeup Language,是一种标记语言,用于标记电子文件使其具有结构性,以方便数据的传输和存储。XML有点像HTML,但又不同,HTML是用来显示数据的,其焦点在于数据的外观,而XML的焦点在于数据的内容。XML文档定义方式包括DTD和Schema。如同JSON一样,XML也是一种数据交换格式。XML由三部分组成:DTD、XLS和XLL。DTD即文档类型定义,规

2015-12-27 22:20:43 1103

原创 【Bash百宝箱】快速使用gcov&lcov构建程序的单元测试

在软件开发过程中,为了验证代码块功能的完备及健壮性,我们常常会做一些单元测试,验证函数的调用符合预期,再加上gcov、lcov这样的工具,可以生成HTML格式的单元测试结果,极大地提供了可读性。下面以一个动态库的单元测试为例,简述gcov、lcov的用法。1、代码准备在“/home/demo”目录下,包括测试代码test.c和被测试代码demo.h、demo.c,如下:// demo.h#ifnd

2015-12-23 13:17:22 1508

原创 【C++】std::vector源码浅析

std::vector是stl标准模板库中的一个序列容器,其源码实现有几个特点:(1)C++中include的标准头文件是没有“.h”后缀的,其实这是C++的一层包裹,内部实现还是在“.h”文件中完成的,以我们include的vector为例,其中还会include一些真正的vector实现文件,如“stl_vector.h”。(2)vector的实现有一些内部使用的函数和数据类型,它们以下划线“_

2015-12-03 15:30:19 7798 2

原创 【C】glibc中字符串处理的几个函数实现分析

在C语言中,我们经常会用到字符串处理的几个函数,如strcat、strcmp、strcpy等,那么这些函数是怎么实现的呢?strcat——char* strcat(char *dest, const char *src);字符串拼接,把src追加到dest后面。测试用例:#include <stdio.h> #include <string.h> int main() { char a

2015-11-26 17:11:46 1496

原创 【Linux】LD_PRELOAD用法

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD&gt;LD_LIBRARY_PATH&gt;/etc/ld.so.cache&gt;/lib&gt;/usr/lib。程序中我们经常要调用一些外部库的函数,以malloc为例,如果我们有个自定义的malloc函数,把它编译成动态库后,通过LD_PRELOAD加载,当程序中调用malloc函数时,调用的

2015-11-20 21:13:12 25808 6

原创 【C】libc中的hook机制

libc中的hook机制,主要用于内存分配,它就像无处不在的钩子一样,一旦设置好了 hook,我们就可以在内存分配的地方随心所欲地做我们想做的事情。 在malloc.h中,声明了一些hook,原型如下:/* Hooks for debugging and user-defined versions. */extern void (*__free_hook) (void *__ptr, const

2015-11-20 20:29:58 4296

原创 【C】使用backtrace获取堆栈信息

1、backtrace一些内存检测工具如Valgrind,调试工具如GDB,可以查看程序运行时函数调用的堆栈信息,有时候在分析程序时要获得堆栈信息,借助于backtrace是很有帮助的,其原型如下: #include <execinfo.h> int backtrace(void **buffer, int size); char **backtrace_sy

2015-11-10 18:21:27 16552 3

原创 【Linux】使用__wrap_malloc查看内存使用

说起C/C++程序,一个老生常谈的问题便是内存分配,而这也是一个难点。在大型的软件开发项目中,常会遇到较大的常驻内存、内存泄露、内存破坏等问题,这些问题往往都是致命的。于是我们就借助于一些内存检测工具、API或者是某种技术手段,来动态地跟踪内存分配,查看内存使用细节,方法很多,各有利弊,GNU链接器就提供了一个好用的方法:–wrap=symbol函数名为“__wrap_symbol”,且称其为包装函

2015-11-09 13:49:38 5067

原创 【C++】C++内存管理

写一个好的C++程序,我们要懂得好多东西,比如说最基本的面向对象编程思想,C++的封装、继承、多态机制,设计模式等,还有一个很重要的内容便是性能优化,像C/C++这种接近底层的语言,追求的就是性能,与之相关的一项内容便是内存管理,内存分配要合理,禁止破坏内存,不能有内存泄漏,操作不好的话,程序可能会越运行越慢,要不就是莫名其妙的crash,于是令人头疼的bug排查就这样开始了。1、内存分配方式在C+

2015-10-26 15:32:25 1111

原创 【C++】C++浅拷贝、深拷贝及引用计数浅析

在C++开发中,经常遇到的一个问题就是与指针相关的内存管理问题,稍有不慎,就会造成内存泄露、内存破坏等严重的问题。不像Java一样,没有指针这个概念,所以也就不必担心与指针相关的一系列问题,但C++不同,从C语言沿袭下来的指针是其一大特点,我们常常要使用new/delete来动态管理内存,那么问题来了,特别是伴随着C++的继承机制,如野指针、无效指针使用、内存泄露、double free、堆碎片等等

2015-10-22 14:00:49 1848

原创 【Bash百宝箱】valgrind简介

Valgrind官网请参考如下网址: http://valgrind.org/1、 Valgrind简介Valgrind定义为framework,用来构建动态分析工具,这些Valgrind工具可以用来检测内存问题、进行性能分析……Valgrind是开源、自由的,基于GNU GPL v2协议,最新的release版本为2014年11月25日的Valgrind-3.10.1,发布了一些可以在多平台上使

2015-09-11 20:18:19 1017

原创 【Bash百宝箱】Linux(Ubuntu-GNOME)桌面常用快捷方式总结

Ctrl + Q: 退出整个Nautilus窗口 Ctrl + W: 关闭当前Nautilus窗口的一个Tab Ctrl + N: 打开一个新的Nautilus窗口 Ctrl + T: 在当前Nautilus窗口打开一个新的TabCtrl + H: 切换隐藏文件(夹)显示状态 Ctrl + 1/2: 以列表方式或图标网格方式查看文件(夹) Ctrl + Shift + N: 创建新文件夹C

2015-09-09 21:05:26 3572

原创 【Bash百宝箱】Linux shell学习

shell特点——Linux有多种shell可以使用,默认的为bash,bash有以下几个主要特点。1、命令记忆能力在命令行中按上下键可以找到一个前/后输入的命令,这些命令记录在~/.bash_history中,这个文件记录的是上一次登录shell以前所执行过的所有命令,当前登录shell所执行的命令则暂存在临时内存中,成功注销系统后这些命令更新到文件中。历史命令可通过history命令查看,再次执

2015-08-21 11:49:35 1586

原创 【Bash百宝箱】vi常用快捷命令大全

现在越来越多的智能IDE出现在工作当中,想必很少有人使用vi了吧,不过在某些场合下 ,vi还是一个必不可少的工具,其中就包括了许多好用的快捷命令,而且有些IDE如Qt还集成了vi。大家都知道,vi有三种模式:一般模式、编辑模式和指令模式,下面总结vi在这三种模式下的快捷命令。1、一般模式光标移动——h、j、k、l:作用分别与键盘左、上、下、右键一样,光标左右移动一个字符或者上下移动一行,前面可加一个

2015-08-17 13:20:37 1154

原创 【Bash百宝箱】Makefile快速入门

一、读懂Makefile1、Makefile简介简单来说,Makefile就是帮助我们编译工程并生成可执行文件。现在的IDE基本上都做了Makefile的事情,并不需要我们自己去手动编写Makefile,但是在Linux环境下,对于一个大型工程,我们常常要定制自己的编译规则,要编译哪些文件,该如何编译,通过Makefile就可以搞定。有了Makefile,只需要执行一个简单的make命令,即可实现自

2015-08-05 14:13:33 2449

原创 【Java】巧用Java关键字

final——final用于类表示该类不能派生子类。 final用于方法表示该方法不能被子类重写。 final用于变量时表示常量,类似于C/C++的const关键字。 final用于成员变量表示该成员变量为常量,不能被修改,必须在变量定义时赋值。 final用于局部变量表示该局部变量为常量,不能被修改,可以在变量定义时赋值,也可以先定义变量后赋值。static——static用于成员变量表示

2015-08-01 14:16:30 1125

空空如也

空空如也

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

TA关注的人

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