- 博客(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关注的人