自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不亦快斋

非典型秃子的老窝

  • 博客(77)
  • 资源 (3)
  • 收藏
  • 关注

原创 boost中max_align的实现疑问

在查看boost::aligned_storage的实现代码时,看到,其中的两个枚举量:size和alignment,size是传入类型的sizeof, alignment则是其对齐边界。alignment = (              alignment_ == std::size_t(-1)            ? ::boost::detail::aligned_storage::al

2006-03-22 18:47:00 3625 3

原创 设计模式笔记(4 ADAPTER & BRIDGE)

ADAPTER(适配器)适用性:想使用一个已经存在的类,而它的接口不符合要求。想创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类协同工作。结构:适配器使用多重继承对一个接口和另一个接口适配。(这和proxy模式可以比较一下)多重继承的更好说法也许是组合。具体如何实现要看适配器的实现复杂程度。思考:被适配的类可能是多样的,但是应该完成相同的功能,适配器类只是用来匹配接口,并不是用来大规

2006-03-14 11:05:00 2153

原创 C++学习推荐书目

语言入门: 有丰富C经验,缺乏C++经验的: 《C++ Primer (3RD)》 有其他语言的丰富经验的: 《The C++ Programming Language》简称TCPL(对不住纯C的fans了) 如果选择薄一点的书:《Essential C++》《Accelerated C++》都是不错的选择。 其实,我个人一直认为C++Primer带着太过强烈的C的痕迹,对于学习C++未必是好事。

2006-03-13 17:35:00 3989 8

原创 C++项目避免线程死锁的体会

    前几天被人问道:如果多线程程序出现死锁,怎么办?突然之间,觉得无法回答.在我写过的程序当中,似乎还没有发生过单纯的死锁问题.自己也写了不少多线程程序了,复杂一点的,超过10个以上的线程互相纠缠,为什么一直没有出现死锁呢?一定是我的的某些行为,能够有效的避免死锁,把他们找出来,将是有价值的.于是,我把最近写的一些项目代码翻出来,仔细的检查了一遍.   多线程发生死锁,无非是占着碗里的,看着锅

2006-03-13 10:55:00 4599 1

原创 设计模式笔记(3 PROTOTYPE & SINGLETON)

PROTOTYPE(原型)适用性:当一个系统应该独立于他的产品创建,构成和表示时,要使用该模式.思考:对比FACTORY METHOD,工厂方法需要统一的Creator,而Creator的提供和被创建对象之间是各自独立的.也就是说,必须为具体的产品类提供相应的Creator(当然,C++的模版技术可以简化一些工作).从语意上来看,工厂方法是凭空创建一个对象,而原型是从已知实例复制新的拷贝.效果上,

2006-03-09 13:35:00 1708

原创 设计模式笔记(2 FACTORY METHOD)

FACTORY METHOD(工厂方法)理解:一个类需要创建某个类的实例,但是,又不知道(或者不该知道)如何创建实例时,需要工厂方法.例如一个TEMPLETE METHOD中,创建各种新实例(比如,各种文档),那么需要提供一个单一的创建接口,而将创建的实现分离出去,这种分离的创建行为,就是工厂模式.很显然,所有的创建行为,都必须提供共同的接口,创建的产品,也必须具有共同接口.这一点和抽象类厂是不一

2006-03-08 15:50:00 1661

原创 设计模式笔记(1 ABSTRACT FACTORY & BUILDER)

设计模式的书已经被翻的很旧了,最近,似乎开始明白书中讲述的内容了.还是把心得体会记录下来,算是一个脚印.1.   ABSTRACT FACTORY(抽象工厂)适用性:一个系统要独立于其产品的创建时.一个系统要由多个产品系列中的一个来配置时.强调一个产品系列从而联合使用时.为一个产品库提供接口,屏蔽实现时.理解:抽象工厂通常作用于多个类似的类系列上,每个系列中,有着基本一致的类元素,或者说,可以为

2006-03-07 11:18:00 1882

原创 宽窄接口分离的代码

templateclass wrap : public narraw{public:    virtual wide& toWide() = 0;    virtual const wide& toWide() const  = 0;protected:    ~warp(){}};templateclass rich : public wide, wrap{    virtual wide& t

2006-01-27 12:10:00 1999

原创 从每日构造到持续继承

    我总是向别人强调每日构造的重要性,也总是强调要自动化--自动化到一次双击,或者一个脚本,就能生成软件的安装包,甚至软件的部署!是的,对于需要部署的软件来说,安装包不是终点,每日构造成功的标志是的部署成功,并且冒烟测试通过。如果这一切任何一个步骤出了问题,那都意味这心跳骤停!     然而,我的这种宣传并没有起到很好的效果,很多人认为,每日构造,就是每日生成release版本的二进制文件,e

2006-01-16 12:55:00 2768

原创 COM,为什么我读不懂你的心

又遇到郁闷的事情:有一个线程,入口大致如下:th_main() {      while(conditon)          svc();}struct ComPair{    ComPair(){ ::CoInitializeEx(0, COINIT_MULTITHREADED);}    ~ComPair(){::CoUninitialize();}};svc(){ComPair com_p

2006-01-16 11:23:00 1885

原创 boost::condition 使用的注意点

进入互斥区的代码{   boost::mutex::scoped_lock guard(m_lock);   .....  m_condition.wait(m_lock);  ......}这里需要注意的是,当wait返回以后,guard已经失效了,不能够再安全地进行需要互斥的的操作了,为了争用操作的互斥,必须再次获得锁,类似:do{   boost::mutex::scoped_lock gu

2006-01-10 13:40:00 6166 2

原创 程序库随想

    我们总是希望有这样一个库:它能够让我们方便的完成某个任务,如果A库使用起来比B库简单那么一点点,我们就更愿意使用A。因此,我们也经常干这样的事情:把一个现有的库做一个薄封装,从而使用起来更适合当前的编程环境。   一般而言,简单的库总是更好的,然而这并不是一定的。我总是能听到一些程序员抱怨:为什么XX库的YY功能不能预先提供一个最简单的使用方式,非要程序员再手工做一些工作。我想,这有两个解

2006-01-10 10:35:00 2072 1

原创 多线程共享COM组件的问题

某个线程创建的COM对象,并不能简单的把接口指针传递给别的线程使用。必须先CoMarshalInterThreadInterfaceInStream整编,然后再CoGetInterfaceAndReleaseStream解编。问题来源:今天在一个ADO程序中遇到此问题。在主线程创建了10个数据库连接的连接池。然后一个tcp服务为每个连接创建新线程,新线程从连接池申请一个连接,从数据库获取信息然后返

2005-12-28 20:30:00 2264 3

原创 当多线程下的析构遇上虚函数

今天遇到的一个教训:有这样的一个基类class service{public:    void start();    void stop();    virtual void svc(); ...    virtual ~service();};service::~service(){ stop();}service是一个服务线程的基类,svc是线程的入口。在析构函数中调用stop确保线程优雅终

2005-12-28 13:02:00 2188 5

原创 shared_ptr跨模块边界的问题

如果shared_ptr默认是用delete来释放对象的,而delete动作产生的是本模块的代码,这在windows平台的dll中遇到了问题:可执行程序和dll分属不同模块,分别使用各自的内存管理组件。直接delete,无异于把A堆管理器分配的指针让B堆管理其去释放,崩溃还算好的,悄悄的出错,死都不知道怎么死的。还好,boost::shared_ptr使用了一个叫get_deleter的东西,内部

2005-12-08 10:43:00 2533 1

原创 boost新版本推出:1.33.1

December 5, 2005 - Version 1.33.1Updated Libraries Any Library: Cast to reference types introduced in 1.33.0 is now documented on any_cast

2005-12-07 18:13:00 1639

原创 两个boost::function判等问题

写了这样一段测试代码:struct A{    int f(int) { return 0;}};A a;typedef function FunType;FunType fun1 = bind(A::f, &a, _1);FunType fun2 = bind(A::f, &a, _1);bool result = fun1 == fun2;   我在vc7.1下编译失败,错误信息如下:erro

2005-12-07 13:44:00 2078

原创 关于版权

如果我买一本书,然后复印了几本送给朋友同事,没有人会起诉我。可是,为什么我买的软件就不能那么干?如果我买了一把菜刀,只要我愿意,我可以为他装上铁柄,并用来劈木头,刀具商人不会起诉我。软件就不可以:我不能反向工程,也不能修改!凭什么?我可以拿消毒柜当储藏柜使用,把自行车改装成助动车,该死的正版软件就不行!所以,我支持版权,但是,我无法同意版权保护,特别是眼下这种变态的版权保护,已经严重威胁到个人的自

2005-11-30 13:45:00 1745 1

原创 boos.Program_options使用记录

po::variables_map vm;po::store(po::parse_command_line(ac, av, desc), vm);po::notify(vm); 在store之后,一定要notify,我老是忘记:(还有,vm其实就是是一个map,可以用迭代器来访问成员的。可以用这个来拆分命令行,而不必用splite或者stringstream来处理。vector args

2005-11-28 14:33:00 1539

原创 看了Direction for C++0x,向往

支持右值构造。在写复合语句--嗯,就是Meyers在《effective stl》里面说的那种write only的代码时候--常常发生这种情况。现在好了,是不是我可以写更多的write only的代码了?并且,考虑把所有的T& 替换成T&&?^_^Rvalue constructors• Often we copy a value just before it isdestroyed● Exam

2005-11-23 20:09:00 1486

原创 VC上尝试输入输出宽字符时发现问题

在VC上尝试输入输出宽字符时发现,wcout.imbue调用,居然会影响wcin wstring t; wcin >> t; //没问题 wcout.imbue(locale("chs")); wcin >> t; //键入中文时有问题而对wclog, wcerr调用imbue,则不对cin产生影响。也就是说,wcout和wcin之间有奇特的关系。对wcin调用imbue,不会影响wcout,反过

2005-10-09 18:21:00 2123

原创 多线程中局部静态变量初始化的陷阱

    C++当中常常需要一个全局唯一的对象实例,这时候,我们就会想到单件模式。如何实现这一模式?全局变量当然是一个简单可行的方法,然而,这太丑陋。嗯,其实,丑陋倒也罢了,最严重的是它将引诱程序员滥用全局变量,这将导致维护的灾难。    既然全局变量是可能有害的,那么,我们我们把它隐藏一下,放到某个类当中去,作为类的静态数据成员。这看上去不错,我也这么认为。当我们只是简单的需要一个全局对象时,这很

2005-10-09 18:00:00 11368 4

原创 一个C++ delegate的实现

更新说明:修改了借口,增加了对smart_ptr的支持。最近需要一个C++delegate的实现,比较接近C#的delegate的用法。翻遍了boost,虽然有相近的东西,但是,始终使用起来问题多多:function:的绑定方式倒也可以接受,成员函数调用的方式实在不爽。而且,同样的函数原型,native和member对应的function类型不同,不同class的相同原型的member funct

2004-11-28 21:50:00 10547 7

原创 Java编程思想---对象的单纯性

Java编程思想:“因此你可以在程序中建立复杂的体系,却将复杂的本质隐藏于对象的单纯性之下."问题:1.对象真的单纯吗?例如C++中的一个类,即使是ofstream好了,简单吗?2.如果说ofstream,CWindow这样的东西是简单的,那么,为什么在这个单纯性之下,我们编写、理解和掌握程序仍旧是那么困难?我现在常常想:单一风格似乎不足以解决所有软件问题,但是多风格如C++,又确实过于繁杂,超出

2004-09-29 09:23:00 1621 1

原创 利用using简化受限的proxy代码和调整访问权

    让我们的一切从代码开始吧,简单起见,代码省略std名字空间:class MyObject {    object_id obj_id_;    class_id  class_id_;    map properties_;    static const type_dict& getDict();...};    这是个从实际的项目中整理出来的代码,简单的说明一下:properties存

2004-09-13 11:14:00 1218 2

转载 每个.Net开发人员应该下载的十种必备工具

每个.Net开发人员应该下载的十种必备工具  作者:James Avery   来源:MSDN   时间:2004年8月4日 23:05   阅读103次  本文讨论:•用于编写单元测试的 NUnit•用于创建代码文档资料的 NDoc•用于生成解决方案的 NAnt•用于生成代码的

2004-08-11 12:50:00 1287

转载 国外计算机图书月旦评

国外计算机图书月旦评2004-03-05 14:09:41 主持人:刘江  长期以来,我们了解国外图书信息的渠道基本上限于亚马逊、巴诺等网上书店,以及有联系的外国出版社,参加相关的展会等等。这样得出的结论或者印象总的来说,不过是只鳞片爪,难窥全豹。  最近参加了一个国际性的出版界会议,有机会了解到一些全球英文计算机图书市场的总体情况,增加了不少全面认识。其实以前

2004-08-11 12:35:00 1892

转载 用Eclipse平台进行C/C++开发

 用Eclipse平台进行C/C++开发 作者:Pawel Leszek 发文时间:2004.05.13我们将概述如何在 C/C++ 开发项目中使用 Eclipse 平台。尽管 Eclipse 主要是一个 Java 开发环境,但其体系结构确保了对其它编程语言的支持。在本文中,您将学习如何使用 C/C++ 开发工具箱(C/C++ Developme

2004-08-11 12:32:00 1590

转载 ASP常用函数表(vbs)

ASP常用函数表(vbs) Array()函数返回一个数组表达式 Array(list)允许数据类型: 字符,数字均可实例: Dim myArray()For i = 1 to 7Redim Preserve myArray(i)myArray(i) = WeekdayName(i)Next%>返回结果: 建立了一个包含7个元素的数组myArraymyArray("Sunday","Mon

2004-08-11 12:31:00 1122

原创 ADO读写CLob字段的方法

C++写入rds->Open("tb_test1", conn.GetInterfacePtr() , adOpenDynamic, adLockOptimistic, adCmdTable);rds->AddNew();rds->Fields->Item[1L]->AppendChunk(_variant_t(strfile.c_str()));rds->Update(); as

2004-08-10 08:52:00 3098

原创 C++中为什么不允许通过返回类型重载函数的辩论

2004-07-05 13:25:31 别逗了问个问题:1。C++中为什么不允许通过返回类型重载函数?2。为什么不允许通过返回类型解析模板函数? 2004-07-05 14:47:55 完美废人返回类型是一种可有可无的东西…… 2004-07-05 16:41:23 完美废人瞧见什么叫高手了吧 2004-07-05 18:32:46 别逗了那operator type()怎么说?不是根据返回

2004-07-08 14:49:00 9699 3

原创 只言片语(二)

春回节未尽,霜重开梅花。山带苍茫色,云归暮霭家。友来同赏酒,人去独品茶。何必悲红袖,丁香可自嘉。 人去了无期,投林归鸟疾。秋迟寒露重,花落香满衣。 已是黄花香满袖,小院正风凉。薄雾幽幽独倚窗,一曲诉衷肠。可叹佳人难再会,空自忆丁香。唱罢余音犹绕梁,云渐散,月如霜。

2004-07-01 13:24:00 1667

原创 只言片语(一)

从一粒沙看见世界从一朵花知道天宸用一只手把握无限用一刹那留住永恒

2004-07-01 13:20:00 1619

原创 远程唤醒源代码

忘记出处了,留着自己用的。 void TWakeUpOnLanForm:: WakeRemoteComputer(AnsiString IPAddress,unsigned char * MacAddress){        unsigned char SendBuf[102];        for( int i = 0; i         {                SendBuf[

2004-07-01 13:18:00 2346

原创 关于bitset的一点疑问

文档中,基本都是如此定义了bitset的一个ctor: bitset(      const basic_string& _Str,      typename basic_string::size_type         _Pos = 0,      typename basic_string::size_type         _Count = basic_string::npos   )

2004-07-01 13:05:00 1491 2

原创 引用计数型指针类的一个实现

这是一段引用计数指针的代码,目标是一个轻量级的、高效率的实现,避免通常实现中的频繁的new/delete引用计数的存储空间。 一些说明: Q:为什么在ref_count的release中delete对象,而不是让外部的ref_count_ptr来释放对象? A:将对象的销毁放到比较高的层次上,从而使得程序员更容易控制对象的销毁策略,看上去是非常有诱惑力的。但是,问题在于,我们使用ref_count

2004-06-30 17:00:00 2053

原创 如何在vc71上用cppunit之研究

奋斗了一下午,才把cppunit在vc6.0上搞定。晕倒。 一个要注意的地方:编译开关/Mld或者/Ml要改成/MDd或/MD。 还要注意打开RTTI,否则会运行时异常。 但是在.net2003上仍然没有搞定,错误信息看上去还是/Ml /MD的问题,但是,我修改了这个编译选项仍然没有解决问题。 郁闷。 ------------------------------------------------

2004-06-28 09:28:00 1902 2

链接器和加载器 中文版

仅供学术研究用,版权属于原书出版社 翻译维护:[email protected] 几乎从有计算机以来,链接器和加载器就是软件开发工具包中的一部分,因为他们是 允许使用模块(而不是一个单独的大文件)来构建程序的关键工具。 早在 1947 年,程序员们就开始使用原始的加载器:将程序的例程存储在多个不同的磁 带上,并将他们合并、重定位为一个程序。在上世纪 60 年代早期,这些加载器就已经发展 的相当完善了。由于那时内存很贵且容量有限,计算机的速度(以今天的标准)很慢,为了 创建复杂的内存覆盖策略(将大容量的程序加在到少量的内存中),以及重复编辑之前链接 过的文件(节省重新创建程序的时间),这些链接器都包含了很多复杂的特性。

2015-10-10

Communicating Sequential Processes

《Communicating Sequential Processes》C. A. R. Hoare

2015-10-10

CPU Cache Page-Coloring

陈怀临:本文通过读者们比较熟悉的妈咪和包厢场景,阐述了高端CPU和大Cache结构中的一个比较略微高深的工程话题--Cache Coloring。高端通信系统设计和实践中,对Cache和 性能的把握是至关重要的

2015-10-10

空空如也

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

TA关注的人

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