自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

李永亮的专栏

设计改变中国!

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

原创 深度探索C++对象模型之局部静态对象

       在读这本书的时候,涉及到这个问题,局部静态对象是个比较有意思的东西,我记得《Modern C++ Design》中就提及过这个东西,在Singleton中使用了这个巧妙的方式。       先说一下局部对象的性质,在第一次执行到的时候初始化,而在最后的时候析构,也就是说如果它生成后,在程序的运行期,它都是有效的,存在于静态存储区,尽管它往往不是时时可见,但可以经由指针操作它,因为

2006-02-15 10:46:00 846

原创 NMS的版本对应问题

昨天在使用NMS函数的时候,发现出现一些以前没有出现过的异常,后来发现问题的所有,原来NMS的驱动和编译的版本不一致。发现这个问题后,重新编译了程序,没有发生任何问题。这个地方可以看出,NMS更改了静态链接库,导致程序出错,需要将新程序重新链接。所以,这里阐明一个基本原则,更换了驱动版本需要重新编译程序。

2006-02-15 10:22:00 1596

原创 RPC效率瓶颈

    我发现RPC的调用曾经效率上很有问题,做了很多的努力,但是总是导致CPU占用过高,这个问题困扰了很久。在这个问题上,曾经做过很多努力不见效果,原来以为传输上的消耗太大,现在发现事情完全不是那么回事。    第一,RPC如果不指定端口,使用TCP的方式,会导致大量端口监听,这本身也是一种消耗。    第二,目前RPC调用是短连接的方式,这种方式每次连接都会认证。这是导致svchost过高的原

2006-02-13 13:42:00 2641

原创 C++编程思想(第2卷)之深入探索string

       以前string用的很少,一般使用char array或者CString,之所以不使用,是因为还不了解string的机制,不会用而并非因为string不好用。本文结合string的源码,深入探索string的用法。       那么从构造开始:basic_string(const E *s, const A& al = A());//字符串  basic_string(c

2006-02-13 11:37:00 982

原创 C++编程思想(第2卷)之查找内存泄漏

       之所以单独写这一章是因为发现了两个非常好用的保留字__FILE__和__LINE__。而C++编程思想把这两个关键字用在查找内存泄漏上,我觉得非常管用。       从用的手段上来说,是用自定义的宏代替关键字。这并称为Dark Technique。但是不管黑猫白猫,能抓住老鼠的就是好猫。用了C++编程思想用用于测试的代码内存泄漏的代码,觉得非常好用。但是还有一定的遗憾。这仅仅适用

2006-02-13 10:09:00 1155

原创 C++编程思想(第2卷)之异常

       之前,写过两篇关于异常的Blog,不过仅仅涉及到异常比较浅的层面,现在我开始阅读《C++编程思想》关于异常的章节,希望进入到异常比较深的层面中去。       在C中,使用了一些比较传统的错误处理机制。通常这样的方法有三种:1.       使用返回值或者全局标志,C中提供了errno和perror()这样的函数。这种函数我没有使用过,但是我用过windows的出错机制。在w

2006-02-13 10:08:00 1523

原创 C++编程思想之操作符=重载

       以前的认识存在一个误区,如下:Type a = b;//这个表示调用拷贝构造函数,而没有调用操作符=而 a =  b;//只调用了操作符=我以前的认识存在误区,所以在实现深拷贝的时候,就需要不仅重载拷贝构造函数,而且要重载操作符=。我以前没有理解这个问题,认识有点片面,个人认为拷贝构造函数都是递归的,在没有的情况下,才使用位拷贝。拷贝构造函数和默认构造函数都是递归

2006-02-13 10:01:00 1106

原创 C++编程思想之SmartPoint

SmartPoint是C++发展的一个热点。我相信Java此类的语言还是存在着他们的优点,这是SmartPoint出现的一个根源,指针是个好东东,但并非放之四海皆准的好东西。指针功能强大,功能强大的另一个意思就是如果出错,也将是灾难性的后果。Java之所以受欢迎是因为它的屏蔽指针也垃圾收集机制。对C++来说,实现这一点并非什么非常困难的事情,现在智能指针正在朝着这个方向努力。我们可以很容易的把指针

2006-02-13 09:36:00 2542

原创 C++编程思想之指向成员的指针

C++存在指向类成员的指针,可以在调用的时候定义:int Object::*ptr = &Object::I;Object类中存在一个成员:int i,指针就是指向这个成员的。类中是没有地址的,所以调用不可以用类来调用,需要使用对象来调用(非静态情况)。Object o;Object* oPtr;调用就可以:o.*ptr;oPtr->*ptr;目前来看没有看到有什么

2006-02-13 09:33:00 772

原创 C++编程思想之默认拷贝构造函数

       C++中类调用拷贝构造函数生成一个对象的情况下,如果拷贝构造函数不存在,则会自动生成一个默认拷贝构造函数。默认构造函数会递归调用成员的拷贝构造函数。如果成员不存在拷贝构造函数,它会按位拷贝。

2006-02-13 09:31:00 1410

原创 Hotswap,我心中的痛

       Hotswap,我曾经三次为此栽过跟头,第一次是刚工作,装了Intel驱动的Hotswap,导致系统蓝屏,当时不知道为什么,重装;第二次是装NMS驱动手按快了,装了,结果在安全模式下删除了;第三次是今天,在工控机上,我以为支持Hotswap,我就装了,结果安全模式进不了,重装机器。吐血!以后决不装Hotswap了,这东东关我屁事。       事情发生三次就不是偶然的了。综合分析

2006-02-09 23:29:00 1023

原创 重构之重新组织函数

1.Extract Method将这段代码放进一个独立的函数里,让函数名称解释该函数的用途。用来搞定Long Method2.Inline Method在函数调用点插入函数体本体,然后移除该函数。3.Inline Temp将所有对该变量的引用动作,替换成对它赋值的那个表达式自身。确定该赋值只用一次。4.Replace Temp With Query将这个表达式提

2006-02-08 18:31:00 714

原创 重构之在对象之间搬移特性

1.Move Method(搬移函数)你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者,或者被后者调用。2.Move Field(搬移值域)在target class建立一个new field,修改source field的所有用户,令它们改用new field。3.Extract Class(提炼类)建立一个新Class,将相关的值域和函数从

2006-02-08 18:30:00 803

原创 重构之重新组织数据

1.Self Encapsulate Field(自封装值域)为这个值域建立取值/设值函数(getting/setting methods),并且只以这些函数来访问值域。2.Replace Data Value with Object(以对象取代数据值)将数据项变成一个对象。3.Change Value to Reference(将实值对象改为引用对象)将Value Objec

2006-02-08 18:29:00 803

原创 重构之简化条件表达式

1.Decompose Conditional(分解条件式)从if、then、else三个段落中分别提炼出独立函数。2.Consolidate Conditional Expression(合并条件式)将这些测试合并为一个条件式,并将这个条件式提炼成为一个独立函数。3.Consolidate Duplicate Conditional Fragments(合并重复的条件片断)将

2006-02-08 18:27:00 867

原创 重构之简化函数调用

1.Rename Method(重新命名函数)修改函数名称。2.Add Parameter(添加参数)为函数添加一个对象参数,让该对象带进函数所需信息。3.Remove Parameter(移除参数)将参数去除。4.Separate Query from Modifier(将查询函数和修改函数分离)建立两个不同的函数,其中一个负责查询,另一个负责修改。5.Param

2006-02-08 18:26:00 844

原创 重构之大型重构

1.Tease Apart Inheritance(梳理并分解继承体系)建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。2.Convert Procedural Design to Objects(将过程化设计转化为对象设计)将数据记录(data records)变成对象,将行为分开,并将行为移入相关对象之中。3.Separate Domain f

2006-02-08 18:24:00 910

原创 重构之处理概括关系

1.Pull Up Field(值域上移)将此一值域移至Superclass。2.Pull Up Method(函数上移)将该函数移至superclass。3.Pull Up Constructor Body(构造函数本体上移)在superclass中新建一个构造函数,并在subclass构造函数中调用它。4.Push Down Method(函数下移)将这个函数移到相

2006-02-08 18:21:00 882

原创 重构之Bad Smells

1.Duplicated Code(重负的代码)2.Long Method(过长的代码)3.Large Class(过大类)4.Long Parameter List(过长参数列)5.Divergent Change(发散式变化)6.ShotgunSurgery(散弹式修改)7.Feature Envy(依恋情结)8.Data Clumps(数据泥团)9.Primi

2006-02-08 18:20:00 900

原创 线程同步与效率的博弈

       先前写过一个程序,多线程保护的很好,运行也很稳定,却发现效率非常低。这让我觉得很郁闷。忽然发现世界上的事情往往如此,不过就是稳定和效率的博弈。改了版本后,取消了很多同步的操作,却发现稳定性降低了很多,同样是很郁闷。       前段时间看《Modern C++ Design》,提到的类锁和对象锁的概念,这里面需要注意以下,我用到的一个全局管理对象,它的锁其实就是一个类锁,过多的使

2006-02-07 18:06:00 1619

原创 是否可以因为时间紧而放松Design

       在上一个项目中,得到一个惨痛的教训——系统的可扩展性不是随便就能够小视的。上一个项目的时间很紧,所以我在考虑架构的可扩展性上下了功夫,现在如果加上什么NetManage之类的应用并不是很困难。但是这次修改的焦点集中在展示的流程方面。老实说,这个地方的可扩展性,我考虑的不是很充足。       当初设定系统配置的出发点是加深运维人员对语音流程的理解,所以将按照流程来分组配置。这样,

2006-02-07 18:04:00 758

原创 静态成员函数不能调用普通成员变量

       这是个人人都知道的小问题,今天却折腾了心浮气躁的我20分钟。       就这么一点错误。静态成员函数是类共享的函数,而普通成员变量则是类所独有的,所以在静态成员函数中调用普通成员变量,最起码直接调用是不可以的。       这是一个小问题,但遇事要慢慢来,不要急。写这篇Blog最主要要提醒自己,凡事必有因,不要着急。

2006-02-07 18:02:00 3631 1

原创 返回值为静态存储区的库函数的多线程问题

       我们常常使用一些库函数,很好用,Very nice. 通常这个时候我们就会懈怠,以为是标准了就不会有问题了。       对此,要说不。我的同事给了我一个example – asctime:       我们要深入源码去追查。在asctime.c这个文件中存在着这个函数的实现。static _TSCHAR buf[_ASCBUFSIZE]; 这就是那个静态存储区,也就是说

2006-02-07 18:01:00 1112

原创 错误发生原因之首

       昨天发生了一个错误,错误的原因非常简单就是因为,没有初始化。《C++编程思想》提出了一个观点,大多数的错误都是因为没有初始化。那么,我们认为C++和C的一个重要区别就是提供了类,而类的出现是为了聚合同类的数据和操作。但为什么会有构造函数和析构函数呢?我觉得这就是C++的哲学了——为了规避初始化之痛。       我们知道局部变量是不会默认初始化的。但对于类来说,我们通常有意识的在

2006-02-07 17:58:00 1096

原创 strncpy和memcpy辨析

char * __cdecl strncpy (        char * dest,        const char * source,        size_t count        ){        char *start = dest;         while (count && (*dest++ = *source++))    /* c

2006-02-07 17:54:00 1150

原创 string和动态链接库——不仅仅如此

       动态链接库是一种常用的技术,但是在和string共用的时候,通常会出现一些问题。网络上有一种说法是因为动态链接和静态链接方式不同的缘故。这样的说法经过测试好像是不对的。我测试结果是和使用的库有关。       在测试中,使用了多种组合,发现在动态链接库和exe文件都使用动态链接的运行时库就没有问题了。这个问题究竟出在什么地方呢?       我开始认为是多线程导致string

2006-02-07 17:43:00 1312

原创 CFileFind之类的问题

在使用CFileFind之类的函数发现一类问题,就是在FindFile之后调用一些成员函数会出现一些莫名的断言不过。这是比较奇怪的问题,在使用了FindNextFile()后,这个问题消失,从MFC上的示例来看,必先调用FileNextFile().仔细一找发现依据了,在MSDN中找到一段:You must call FindNextFile at least once before callin

2006-02-07 17:35:00 929

原创 从getpid()开始

       这是一个非常通用的开始,就是我的”Hello world!”。我目前拥有两个可以使用的资源,分别是Linux和Solaris,条件是很不错的。我争取程序在两个环境都可以编译,并区分这两个环境的不同。       从getpid这个例子开始,并没有在平台上有所区别。在Windows上只是包含的头文件不一样而已,在Linux和Solaris甚至没有区别。我觉得可以认为二者的共同点颇多

2006-02-06 18:20:00 3024

原创 UNIX&&LINUX开篇

       这所以写这一个栏目是因为我感觉的了涉足于这一领域的重要性,从开始的项目经验到Intel的培训可以看到这一个苗头。对于Windows和Unix/Linux的比较问题已经烂了,没什么好说的。涉足的原因是想自己可以更加全面一点,可以对更多的领域有更多的了解。一旦如果出现平台转移的情况,不至于会遇到措手不及的情况。       从目前的情况来看,运营商对Unix是比较认可的,Linux怎

2006-02-06 18:15:00 890

原创 C++的CLI版本起步

       昨天,DOWN了一个VC2005的Beta2版本,我准备开始学习C++/CLI,在CSDN的投票中JAVA已经超过了C/C++。如果故步自封,无疑死路一条。       我在开发过程中,也接触了一些JAVA,我相信C++还是非常有前景的工具。但是他在不足还是显而易见的。C++中缺乏对Internet的足够支持,是非常大的缺憾。而且因为C++的难度,使得C++的开源不如JAVA

2006-02-06 17:43:00 941

空空如也

空空如也

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

TA关注的人

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