自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

win2ks

山高月小 水落石出

  • 博客(35)
  • 收藏
  • 关注

原创 编译阶段侦测相同性

Loki中中有一个类似这样的类用以在编译阶段侦测两个类型是否具有可转换性:template    typename T,typename U>class TestType...{    typedef    char            Small;    typedef    struct...{char buf[2];}    Big;    Small    Test(T);   

2007-09-30 01:32:00 694

原创 ACE封装——针对效率实施优化

避免使用虚函数和动态内存。 我在前一篇里提到,ace有的时候避免使用bridge模式,这是因为动态内存的分配会降低效率,同时,为了消除动态类型对效率的影响,ace的wrapper facade避免使用虚方法。多考虑使用内联函数。ace wrapper多是对c函数的封装,为了避免封装降低效率,ace在关键路径上使用内联函数(另外,在性能关键位置避免使用虚函数)。没有异常处理。其实

2007-09-29 20:32:00 768

原创 ACE封装——尽可能多的隐藏平台间的差异

ACE是个跨平台的东西,所以着力点之一就是为不同平台提供同样一个接口,但这永远都只是一个美好的梦想,试想一下,linux下无线程这个东西,windows用户对信号量这个东西也颇为陌生。提供统一接口最大的挑战是有些东西有些平台支持,而另外一些平台没有。为了接口的统一,最好不提供这些功能的封装,但是有时候,这些特定平台适用的东西在它们的平台上效率很高,有时候尽管一些平台没有对某种功能的支持,但是从

2007-09-29 20:19:00 745

原创 ACE封装——使用继承提高设计清晰和可扩性

做过网络编程的人都知道sockaddr这个东西,其实最初的时候我也无法理解,为什么要强转指针又传递sizeof这个东西呢。其实这是C的继承,unix和internet领域有不同的sockaddr形式,sockaddr是逻辑上的基类,通过不同的sizeof可以获得正确的类型信息然后转型。这真是太不好了。如果你使用的代码中有这样良好的设计但是没有良好的代码形式,那你表现的时候到了,简单的一个C

2007-09-29 13:28:00 774

原创 ACE封装——简化常见形式

在以往的文章中,我常提起聚合封装或者类似的词汇,其实这都是ace简化常见形式范畴中的将多个方法合并成一个方法。这尤其适用很多细节又容易落下的时候。第一次接触初始化一个监听连接的soket恐怕会费一些记忆,二者这个流程一般是固定的,这最适合封装成一个方法供使用,因为这只是一个facade,这是非常显然的facade模式。创建一个线程的参数也是需要一定记忆的,而多数时候我们实用的是特定的一个参

2007-09-29 12:16:00 1138

原创 ACE封装——增强类型安全性

从第一篇开始我就在讨论ace的封装,不同场合使用的同一物件封装成不同类型是提的比较多的一点。这集中提现在socket上,一个socket可以是监听连接的,可以是已经连接用以发送数据的,如果你还愿意划分,它还可以是连往其他位置的状态,这就会引发错误使用,譬如在接受连接的socket上发送数据或者用一个正在发送数据的socket连接远端,为了一次性的解决掉这个问题,ACE使用了增强类型安全性这个法则。

2007-09-29 11:42:00 1057

原创 何时使用模板——再论完整传递数组

模板的终极用途我已经说过了,只是驱动编译器帮我们生成代码,但是可以使用模板的时候却很多, 由传递完整数组信息我想到使用模板的一种情况——获取我们无法得到的信息。有些信息编译器知道,但我们不知道,而模板是在编译阶段工作的,因此,合理利用模板我们可以获取一些原本无法得到的东西,这里我想到的是1.完整传递数组2.swap函数和3.编译期的选择处理。1.正如我在上一篇“完整传递数组信息”里所展示的

2007-09-29 11:07:00 808

原创 利用模板传递完整数组信息

我们都知道,对于void doSomething(char buf[])而言,buf只是一个char*,对其求sizeof无法获得buf缓冲大小,有时候,尤其是需要验证缓冲是否大小合法的时候,获取数组完整信息是十分有必要的,而这要求sizeof获得的buf是直接的buf[]而不是char*,在我所知道的情况里,如果不用模板,我们总是传递的一个指针,而使用模板的时候,只有传递引用才可以获得正确的数组

2007-09-29 01:18:00 918

原创 ACE_Thread_Manager

ace是对若干东西的封装,所以从看问题本质的角度来说,了解ACE先要熟悉被它封装的东西。thread管理也是如此。开辟一个线程在不同的系统上有不同的方法,而且这个线程的代价也不尽一样,但是肯定有些东西是共性的,就譬如ACE做thead_manager的接口的时候定义的那些参数一样,往常复杂不易使用的步骤组合被ACE加以封装。其实直到目前为止我也一直认为thread manager是为了ac

2007-09-27 18:03:00 3772 6

原创 对ACE select的考虑

我在前面的代码里已经展示了使用传统select方式开发并发程序的简单流程和它的便利性。但是,和传统的CApis一样,它也有不方便和不安全的地方。首先fd_set是一个结构,靠着几个外部方法调整内部数据,撇去记忆上的压力,在操作过程中取址、memcpy(我排斥这个方法因为它给我带来很多不易发觉的问题)、轮询等都容易出错,尽管有些编译器可以帮我们诊断问题,但是C++程序员一定想要一个好的封装,这便

2007-09-27 16:51:00 2830

原创 socket select代码

做多了windows,发现多select模式是那么的陌生,当想用心挖掘一下ACE::select的封装的时候,才发现自己几乎写不出一个完整的select模式示例,这其实是我一直没有重视过这个东西,现在细细分析来,发现,它要比我以往在处理类似问题的时候处理的更为简单。    WSAData    wd;    WSAStartup(MAKEWORD(2,2),&wd);    SOCKET 

2007-09-27 14:46:00 1782

原创 使用继承和模板拆分大类

长久以来,我一直寻找把过大的类拆分的方法,我曾经使用过的,也就是把一些功能提取成一个类使用has-a的关系包含。但是这将造成极大的文件关联、依赖性,当编译需要的时间让你无法容忍的时候,你会对降低依赖性乐此不疲。我使用了继承,把数据抽象在基类里,这可以降低操作方法的文件依赖性,但是效果不明显。直到我疯狂的使用模板,如果你喜欢,你还可以定制逻辑上只接受特定类的模板,而这个模板本身编译的时候不需

2007-09-25 12:31:00 778

原创 广义factory

 工厂生产一种产品,其实new也是一个工厂,GoF里还对工厂有更细的划分,但是,这给人的感觉是工厂是从无到有的,其实不是这样,工厂也可以从有到有。new是一个工厂,它生成的是初级产品。对于一个初级产品来说,你可能想让它个性化,譬如每个学生都有自己的名字,学生都一样,但是用学生产生带名字的学生的过程也是一次工厂作用。ACE_SOCK_Acceptor和ACE_SOCK_Connector就是

2007-09-21 17:17:00 743

原创 ACE_IPC_SAP的封装

对int_addr的封装是为了避免细节使用上的问题,那对ipc_sap的封装则是为了避免功能上的使用问题。 一个sock可以充当3个角色:监听者、连接者和数据传递者。你可能在一个需要监听者的地方传递了数据传递者,编译器不会给你任何提示,这是让我们无法容忍的,我们要创建一个规则阻止这样的行为,让他们是不同的类型就可以了,我们在这方面已经很有经验了。由此我们对封装有了两点经验:1.当细节太

2007-09-21 16:55:00 1576

原创 再论ACE_INET_Addr看封装

 SOCKADDR本身是C的一个结构,C已经对它进行了封装,可惜使用的时候你要操作一大堆细节,这增大了出错率。我们来看SOCKADDR为我们提供了一个什么样的功能。1.它为其他部分提供信息。我们把信息传递给sockaddr,以后传递sockaddr给需要地址信息的部分。2.它提供查询功能别人传递过来的sockaddr你可能要做检查合法性等若干需要获取信息的操作。sockad

2007-09-21 16:33:00 1410

原创 ACE_INET_Addr

目录 一、        关于WAP的常见问答二、       关于WML的常见问答三、       关于WAP开发的常见问答四、关于WMLScript的常见问答五、关于WBMP的常见问答六、关于WAP网关的常见问答七、关于WAP浏览器的常见问答八、关于WAP手机的常见问答九、关于WAP安全的常见问答十、关于WAP其他方面问答十一、关于WAP站点建设

2007-09-21 15:25:00 7308 1

原创 ACE_Message_Block

ACE_Message_Block是ACE非常底层和常用的一个类,但是对它的掌握却不是很容易的事情,我想大多数是因为它很多的方法和它的名字。其实,把它叫做ACE_Memory_Block可能会让人好理解很多,它就是一块内存,你对内存操作要有指针指示当前位置,它的rd_ptr和wr_ptr就是这个功能。内存块可以连接、复制、求长度、获取缓冲大小等。用内存块的思想理解这个类的所有方法对事情会变的简单很

2007-09-21 13:51:00 1323 2

原创 ACE Socket Wrapper Facade

如果你用C++以bind、listen、accept做了很长时间的网络应用开发,看到ACE的对socket的封装,你一定被它深深吸引,除非你是一个严格流程化的人,从来没有在bing、listen、accept的过程中碰到过任何苦恼。接触ACE很长一段时间后也没有用心的去思考它,直到细致的看了一遍ACE的这个facade,我觉得我有必要研究一下ACE这个老新朋友了。1.ACE_INET_Ad

2007-09-21 13:36:00 1924 1

原创 再论双分派

暴力双分派速度快,可是当类增多时,代价依然很大。map双分派在速度优化上有dynamic_cast和static_cast两种选择,Loki把这个选择做成了Policy。矩阵双分派速度上有天然的优势,但是你要修改你的类。于是Loki也把这个做成了Policy供你选择。矩阵双分派的思想是,在你的class里保存分配器使用的一个id值,分配器可以随时获取或者设置它。分派器操作此值构造矩阵,

2007-09-20 19:20:00 1075

原创 运行阶段双分派

如果你想在运行阶段分派,你将避免暴力手段,因为简单的dynamic_cast底层一样消耗我们的效率。pair是个不错的东西,它可以把两个东西当成一个用。pair两个类型作为索引可以获得双分派的目标函数,这是最朴素的想法:template    class BaseLhs,class BaseRhs,typename ResultType>class    BasicDispatcher

2007-09-20 18:44:00 716

原创 暴力双分派再论TList

TypeList是Loki从外星引进的强大引擎, TypeList由模板支持构建,但是被构建出来的TypeList给了模板神奇的能力,Loki给予新知,源于模板,Loki给予震撼,源于TypeList。其实TList很简单,但是它给我们带来的便利让我们如何赞扬它都不为过。其实,在暴力双分派的对称处理中,我们只使用了TList::IndexOf工具,为了支持对称分派,我们在调用的时候做手脚:

2007-09-20 13:30:00 730

原创 暴力双分派

暴力活是程序员都不想做的,但有的时候你别无选择,但是这种情况下你并不是没有子弹了,暴力可做的事情,多数是类似的重复劳动,C++编译器可以帮我们做这些,只不过你要给编译器一个生成规则,模板是一个描述这种规则的工具。我来展示一个极其野蛮的行为,有如下4个class:class MyA;class MyB;class MyC;class MyD;为了对其双分配,我们需要如下方法:

2007-09-20 11:39:00 1233

原创 Loki库里的Cyclic Visitor

Loki给你一个选择,你可以使用经典GoF描述的Visitor模式,但是,使用这个模式获得效率的同时使你的修改更为麻烦,其实理想的办法是是使用Acyclic模式,当稳定后要优化的时候再改为Cyclic模式。我这个给一个使用Cyclic模式的完整代码(头文件和名称空间要自己处理)。class VA;class VB;class VC;typedef    CyclicVisitorvoi

2007-09-19 17:17:00 1035

原创 Loki库里的Acyclic Visitor

已经知道,使用 Visitor有这样那样的不便。Loki为了避免这些提供了两个方案,之一就是Acyclic的类库化。class BaseVisitor...{public:    virtual    ~BaseVisitor()...{};};template    class T,typename R = void>class Visitor...{public:    typedef

2007-09-19 16:16:00 835

原创 Visitor模式与Acyclic Visitor

visitor模式最基本的是访问者和被访问者。它的优势是不用改变被访问类的任何结构就可以对被访问者施加新的操作,前提是增加一个访问者的子类。其实就是用增加访问者子类的方法替代被访问者方法的增加。用你不需要的便利换取你需要的功能。访问者执行一些对被访问者的一些操作,实现方式是在被访问者中调用访问者的方法,把自己(this指针)传进去。这样对被访问者的一次调用被隐式转移到访问者对被访问者的一些

2007-09-19 15:42:00 2853 1

原创 由AF再论template的再考虑

AF模式运行使用任何实现方法,只要AbstractFactory被完全实现。那开发一个原型产品工厂完全不用修改底层的东西。使用template的本质论。如果我们开发原型工厂,那在new对象的时候要换成原型的拷贝,明显,保存一个原型是解决这个问题的核心,如此则有:template    class ConcreteProduct,class Base>class    Prototype

2007-09-19 13:56:00 693

原创 由AF再论template

template的伟大魅力在于它的自动生成代码能力,基于template的技术,无论多么高深仰或多么花哨,只要你明白它的自动生成代码的本质,问题会好处理很多。譬如AbstractFactory在template下的loki做法,它只是为了让编译器帮我们生成代码而已,如果你考虑手写代码,问题会好理解很多。A抽象基类问题如果你要使用AbstractFactory模式,那你首先要有一个基类,

2007-09-19 13:38:00 685

原创 Abstract Factory

 Object Factory用以生成一个对象,Abstract Factory用以生成多个关联的对象。对于Abstract Factory而言,它有两个问题造成耦合度太高。一是Abstract Factory必须知道所有Abstruct Product,具体工厂必须知道它要生成的所有具体类。Loki的AF解决了这个问题,在这里,我关心它如何做到的。对于AF的抽象接口,Loki如此处理

2007-09-19 10:59:00 708

原创 Object Factory

可以定义基类create方法,但是具体的生成方法由子类去实现。也可以以一个特征值产生对象。这是Object Factory可以做的事情。 从生成对象的角度来说,生成一个特定的对象只要知道特定的一个类就可以了,虚函数可以给我们这个便利。但是通过一个特征值生成对象,首先要解决的问题是生成方法要知道所有可以生成的类、极端情况下,后期添加类是极有可能的。这里有两点,第一,我们不想使用switch,

2007-09-18 18:40:00 752

原创 获取系统时间

获取系统时间SYSTEMTIME    st;GetLocalTime(&st);st.wMonth;        //month;st.wDayOfWeek;    //weakst.wHour;        //hour 

2007-09-18 15:17:00 464

原创 智能指针的其他几个问题(2/2)

4.次序比较如果熟悉stl,你已经知道,对于所有比较而言,定义一个less操作符就够了。其他所有操作都可以通过less获得。对于smartpointer而言,你可以不支持次序比较操作(定义而不实现),也可以通过定义operator另外,指针有两个概念,iterator和moniker,iterator关心遍历,moniker关心替代对象本身。举个例子来说,vector关心二者,list

2007-09-18 12:12:00 628

原创 智能指针的其他几个问题(1/2)

1.Address-Of操作(取址) 我们可以使用指向指针的指针,这需要对指针取址,我们很容易把同样的想法加在智能指针上,但是,使用智能指针的目的是管理指针,直接暴露给外界底层的指针一定不是什么好事,而且,定义了取址操作的类型几乎不可能被使用于范型编程。从这个意义上来说,远离Address-Of操作是个不错的选择。2.隐式转换(Implicit Conversion)至原始指针被传

2007-09-18 11:13:00 596

原创 智能指针拥有权问题

 1.深拷贝问题在于对于一个指向基类的指针采用深拷贝或者对象本身的拷贝函数不确定的时候,问题变的视乎极难处理。2.临写拷贝同样也存在问题,它对调用者提出了比较高的要求,因为指针本身不知道是否执行临写拷贝。3.引用计数是好,可以这也有多个策略。a.为了指向引用计数段,指针大小翻倍,会导致空间占用量爬升。而且,必须在栈上保存计数器,分配这个小对象的C++分配器的效率也不尽人意,而且在栈空间紧缺

2007-09-13 17:24:00 599

原创 Singleton all in one

1.将default构造函数声明为私有的的。 这保证了不被非法创建,当然,个人觉得,这不是单件的必然要求,只是为了保证单件安全性。如果你认为一个方法是私有的,那你不要在外部使用它就是了,某些一样很优雅的语言也使用这个约定来保护私有数据,当然,这是着力于小规模项目的语言的策略。2.将copy构造函数定义为私有的。这是容易忽视的一点,如果你不定义copy构造函数,编译器会帮你定义一个,自己声明一个

2007-09-04 17:19:00 569

原创 typelist和functor的比较

template可以把不少事情在编译期处理,只不过编译期处理要求所有东西都是确定的。你不可能用一个在运行阶段才知道的数据填充编译期处理问题的参数。typelist是编译期处理的东西。类型拼接和获取等一系列策略都在编译期完成。同是采用template思想,functor却对类型没有特殊要求,因而你可以把一些运行阶段得到的参数传给functor、bindfirst,明白代码让这个问题更容易理解

2007-09-03 12:06:00 686

空空如也

空空如也

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

TA关注的人

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