随笔分类 - [30]C++
-
C++设计模式-Flyweight享元模式
摘要:C++设计模式-Flyweight享元模式Flyweight享元模式作用:运用共享技术有效地支持大量细粒度的对象。内部状态intrinsic和外部状态extrinsic:1)Flyweight模式中,最重要的是将对象分解成intrinsic和extrinsic两部分。2)内部状态:在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态3)外部状态:而随环境改变而改变的,取决于应用环境,或是实时数据,这些不可以共享的东西就是外部状态了。4)内部状态和外部状态之间的区别: 在Flyweight模式应用中,通常修改的是外部状态属性,而内部状态属性一般都是用于参考或计算时引用. 阅读全文
-
C++中内存泄漏的检测方法介绍
摘要:C++中内存泄漏的检测方法介绍首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控,分如下两种情况: 一. 在 MFC 中检测内存泄漏 假如是用MFC的程序的话,很简单。默认的就有内存泄露检测的功能。 我们用VS2005生成了一个MFC的对话框的程序,发现他可以自动的检测内存泄露。不用我们做任何特殊的操作。仔细观察,发现在每个CPP文件中,都有下面的代码:#ifdef _D... 阅读全文
-
C++设计模式-Decorator装饰模式
摘要:C++设计模式-Decorator装饰模式Decorator装饰模式作用:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。UML图如下:Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。要善于变通, 阅读全文
-
C++设计模式-Adapter适配器模式
摘要:C++设计模式-Adapter适配器模式Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。分为类适配器模式和对象适配器模式。系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。比如购买的第三方开发组件,该组件接口与我们自己系统的接口不相同,或者由于某种原因无法直 阅读全文
-
C++设计模式-Prototype原型模式
摘要:C++设计模式-Prototype原型模式作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。UML图如下:代码如下:Prototype.h 1 #ifndef _PROTOTYPE_H_ 2 #define _PROTOTYPE_H_ 3 4 /*Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone) 5 Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现 6 7 作用: 8 ... 阅读全文
-
指针与引用
摘要:指针与引用【C++自我精讲】基础系列一 指针与引用0前言指针、引用、指针与引用区别。1指针变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间。//变量int nNum; //声明名字为nNum的int型存储空间nNum = 100; //nNum存储值100nNum = 200; //改变nNum存储值200指针:又叫一级指针,用来指示一个内存地址的变量。对于一个类型T(int、char、folat...),T*就是指向T的指针类型,一个T*类型的变量保存了一个T对象的地址。//指针int *pNum; //定义指针pNumpNum = &nNu... 阅读全文
-
适配器模式及C++实现
摘要:适配器模式及C++实现适配器模式适配器模式是很好理解的模式了,生活中也非常常见,什么插头2口转3口,什么USB转PS2,这都算是适配器模式。说白了,就是如果有一些东西提供的接口你很像用,但是你手头没有好的接口使用它,这个就需要一个适配器,将你需要的接口转换成你所拥有的接口。这样的好处也是显而易见,就是你不用改变你现在所拥有的接口,保证你在任何地方的用法都不需要修改,然后底层的实现由适配器调用需要的接口来具体实现。常见的场景使用第三方库的时候,第三方的库肯定不能适用所有的系统,所以需要一个适配器来转换。优点1.屏蔽了具体的实现方式,实现了依赖倒转。2.可以把不统一的接口封装起来,使之成为统一的接 阅读全文
-
更快的memcpy
摘要:更快的memcpy写代码有时候和笃信宗教一样,一旦信仰崩溃,是最难受的事情。早年我读过云风的一篇《VC 对 memcpy 的优化》,以及《Efficiency geek 2: copying data in C/C++, optimisation》,所以我是坚信很难能写出比C运行时库更快的memcpy的。但最近有两个事情,让我对这个坚信产生了怀疑。第一个个是最近在看lz4的代码,lz4可能是目前最快的内存压缩算法,部分评测他比snappy还要快点(lz4的实现后面专文剖析)。研究他的代码,发现他其中有个重要的和其他代码不同地方就是他的内存拷贝采用的是一个宏,而不是使用memcpy。其内部直接使 阅读全文
-
关于C++中Object所占内存空间探索1
摘要:关于C++中Object所占内存空间探索(一)有如下问题:1. 一个空类,class X{ };2.类中含有数据成员(Data Member),class X{public: //Functionsprivate: int val; char bit1;};3. 类中含有数据成员(Data Member)和虚函数,class X{public: virtual void test(); //Other Functionsprivate: int val; char bit1;};分别对以上三个类求sizeof(X)的大小。这问题有些简单,本人第一次看到... 阅读全文
-
OpenCV中的神器Image Watch
摘要:OpenCV中的神器Image WatchImage Watch是在VS2012上使用的一款OpenCV工具,能够实时显示图像和矩阵Mat的内容,跟Matlab很像,方便程序调试,相当好用。跟VS2012配合使用,简直就是一款神器!让我一下就爱上它了!第一次看到Image Watch是今年3、4月份的时候,当时是在微博上看到新闻,点击链接的下载页面一直出问题,后面就忘了这事,昨天碰巧在OpenCV主页看到OpenCV2.4.5的Change Logs里面有链接,点进能下载果断试用下啊!闲话少说,先看看部分相关链接。1、Image Watch 的下载链接。2、OpenCV关于Image Watc 阅读全文
-
设计模式——工厂模式 (C++实现)
摘要:设计模式——工厂模式 (C++实现)软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核心的厂家,它只有一个工厂,能够生产两种核心的处理器核。客户需要什么样的处理器核 阅读全文
-
桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
摘要:桥接模式及C++实现桥接模式先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化。桥接模式号称设计模式中最难理解的模式之一,关键就是这个抽象和实现的分离非常让人奇怪,大部分人刚看到这个定义的时候都会认为实现就是继承自抽象,那怎么可能将他们分离呢。这里引用《大话设计模式》里面的那个例子。这个例子中,每次添加一个新的手机品牌,则必须要添加相应的通讯录和游戏,而每次要给每个手机添加新功能,则所有的手机品牌下都必须继承一个新的类,这样工作量就大了,而且可能通讯录和游戏的实现方法是一样的,这就有很多重复代码。看到这里可能已经看到了端 阅读全文
-
C++设计模式-Factory工厂模式
摘要:C++设计模式-Factory工厂模式Factory1、定义创建对象的接口,封装对象的创建2、将实际创建工作延迟到子类中,例如,类A中药使用类B,B是抽象父类,但是在类A中不知道具体要实例化哪一个B的子类,但是在类A的子类D中是可以知道的。在A中无法使用 new B***()方法3、将创建工作延迟到子类中后,核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂,只提供工厂子类必须实现的接口,这样的好处是可以不用修改已有的工厂类的情况下增加新的产品(每一种产品,都分别对应相应的工厂子类负责其创建工作)使用场景:用于一类类(所创建的产品继承共同的产品基类)的创建实现方式1:对每一个子类产品都分 阅读全文
-
C++ 容器的综合应用的一个简单实例——文本查询程序
摘要:C++ 容器的综合应用的一个简单实例——文本查询程序[0. 需求]最近在粗略学习《C++ Primer 4th》的容器内容,关联容器的章节末尾有个很不错的实例。通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解。由于是浅略探讨研究,高手可无视,各位读者发现有什么不妥的地方,请指教。程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 1行应该在第 2 行之前输出,依此类推。本人用到的文本文件“ inputfile.txt ”,内容如下( 阅读全文
-
单例模式及C++实现代码
摘要:单例模式及C++实现代码单例模式单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能会优先考虑使用全局或者静态变量的方式,这样比较简单,也是没学过设计模式的人所能想到的最简单的方式了。一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,即增加了开销,也使得代码更加臃肿。其实,我们只需要一个实例对象就可以。如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响。考虑到这些需要,我们将默认的 阅读全文
-
探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别2
摘要:探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(二)看此文,务必需要先了解本文讨论的背景,不多说,给出链接:探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(一)本文会以此问题作为讨论的实例,来具体讨论以下四个问题:(1) C++变量生命周期(2) C++变量在栈中分配方式(3) C++类的内存布局(4) Debug和Release程序的区别1、Debug版本输出现象解析先来说说Debug版本的输出,前5次输出,交替输出,后5次输出,交替输出,但是,前5次和后5次的地址是不一样的。我们来看看反汇编: ... 阅读全文
-
C# 与 C++强强联合--C#中的指针
摘要:C# 与 C++强强联合--C#中的指针非常的不好意思,距离上次随笔C# 与 C++强强联合已经过去快1个月了。承诺大家的C#指针和A*算法迟迟未上。为表歉意献上美女一枚 哈哈。流口水了吧 话归正题。 一、指针是什么呢? 指针就是指针嘛!这是我的第一想法。因为我觉得这样解释已经很明确了。要更明确的话,指针是对系统使用的变量、方法在内存上的一个页签,通过指针就能找到他们。 二、C#指针有那些应用? int* p表示一个变量内存地址,delegate通常用于表示对方法的引用。 三、应用 1、* unsafe static voi... 阅读全文
-
智能指针与库
摘要:智能指针与库最近尝试写一些基本的C++泛型组件,其实很多都是boost里已经有了,但是还是喜欢自己再写一下, 原因有三:1. boost太庞大,拿来学习不错,但是一般不会直接在项目中把它import进来。2. C++11也挺不错,但是现在工作还是以VS2008为主,所以这些新特性暂时用不上。3. 重复造轮子才能更好的理解轮子背后的原理,以后才能更好的操作轮子。看一些库时发现仅指针一项就有挺多封装, 思考为什么需要智能指针?通过智能指针可以以RAII的方式管理对象, 编写异常安全的代码; 原始的指针没有标明对象所有权的情况, 对象是你单独拥有的?还是你和别人共享对象, 但是你也参与管理? 还是你 阅读全文
-
探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别
摘要:探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(一)今天看博客园的文章,发现博问栏目中有一个网友的问题挺有趣的,就点进去看了下,标题是“C++生存期问题”,给出链接:http://q.cnblogs.com/q/51133/本文会以此问题作为讨论的实例,来具体讨论以下四个问题:(1) C++变量生命周期(2) C++变量在栈中分配方式(3) C++类的内存布局(4) Debug和Release程序的区别也许您觉得这些讨论问题没有实际意义,应该多做些提高生产力的事情,如同重复发明轮子也是没有意义的。笔者同意这个观点,但是,作为一个有追求的程序员,应该知其然 阅读全文
-
Singleton模式C++实现
摘要:Singleton模式C++实现Singleton是设计模式中比较简单的一个。园中的朋友们应该都很熟悉了。前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个。当时由于在有些地方考虑不太周全,代码出现了一些疏漏。不过最终写出了合格的实现。Singleton模式要求:1、保证类只有一个实例2、实例只能由类自身构造3、必须为其他所有对象提供这一对象以访问。由此,我们画出Singleton模式的结构图如下:根据要求,类实例只能由自身构造,因此必须要控制构造函数(默认构造函数和拷贝构造函数)的访问权限(这里不考虑继承的问题)。class Singleton{ private: ... 阅读全文