C++
文章平均质量分 72
lifesider
人生就是一次在自我迷失中寻找自我的长途旅行
展开
-
使用宏对产品版本号和文件版本号进行统一管理
问题描述:在每次发布版本时,最简单的就是在资源(*.rc)文件中修改当前文件和产品的版本号(如a.b.c.d),但是随着时间的推移,需要发布的DLL越来越多,于是每次修改时意味更多的时间和精力消耗,你得一个一个的打开各个DLL中的资源文件,然后修改,而且一不小心还会将版本号弄错。解决方案:多次这样之后,我觉得每次都要修改各个DLL很繁琐,既然VC支持宏开关,何不使用宏试一试呢?新增一个文件version_ctrl.h,比如对于X.dll,定义如下宏:// product#define PRODUCTVERS原创 2011-05-21 09:14:00 · 2010 阅读 · 1 评论 -
struct、class和STL的统一内存管理
利用C++的new和delete操作符重载特性,可以对自定义的struct和class进行统一内存管理,再加上STL allocator的开放特性,便可以将STL容器对象的内存管理并入struct和class的内存管理,进而将这三者的内存管理统一。首先实现自定义的内存管理算法框架,开放接口为allocate和deallocate,实现库为memmgr.dllclass memory_manager{public: virtual void* allocate(size_t size) = 0;原创 2011-05-24 21:02:00 · 1682 阅读 · 0 评论 -
深入理解 STL allocator
由于std::set,std::multiset,std::map,std::multimap四种容器的插入删除操作性能高并且自动排序,在很多时候比如需要动态操作时往往会使用它们,然后由于容器内部使用的是节点,每次的插入或删除都要调用new或delete,往往容易造成碎片和性能下降,于是自定义的allocator出现了。这篇文章的目的就是详细讲解std::allocator的内部结构,为实现自原创 2011-06-06 12:00:00 · 12195 阅读 · 0 评论 -
C++惯用法:通过成员模板实现隐式转换(Coercion by Member Template)
往往将子类指针转换成父类指针进行操作是常见的且是非常有用的,如下class base {};class derive : public base {};base* pb = NULL;derive* pd = NULL;pb = pd; 同样,对于内建类型(built-in type)的隐式转换也是常见的,如下char c = A;short原创 2011-06-05 12:43:00 · 3385 阅读 · 0 评论 -
C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
意图:使用派生类作为模板参数特化基类。 与多态的区别:多态是动态绑定(运行时绑定),CRTP是静态绑定(编译时绑定) 在实现多态时,需要重写虚函数,因而这是运行时绑定的操作。然而如果想在编译期确定通过基类来得到派生类的行为,CRTP便是一种独佳选择,它是通过派生类覆盖基类成员函数来实现静态绑定的。 范式:class derived : public base原创 2011-06-06 10:04:00 · 8737 阅读 · 2 评论 -
实现自定义的 STL allocator
STL allocator 的注释讲解请见:http://blog.csdn.net/lifesider/archive/2011/06/06/6527776.aspx 这里实现的自定义allocator是继承自std::allocator,因为两者有公共部分,对于完全重写的allocator,下面的内容就不用读了。 上源码#include templateclas原创 2011-06-06 12:13:00 · 9097 阅读 · 0 评论 -
无锁的数据结构(Lock-Free)及CAS(Compare-and-Swap)机制
当同时存在读写线程时,默认情况下是不保证线程安全的,因而需要利用信号量来进行线程同步(Synchronization),如关键代码段、互斥体等,同时操作系统也提供了相应的API。然而同步并不总是满足条件的且有效率的,比如陷入内核时会有性能损失、死锁、活锁以及资原创 2011-07-03 22:10:52 · 20050 阅读 · 1 评论 -
Ubuntu 12.04 配置intel c++ compiler开发环境
之前一直在windows下开发,写了很多内嵌汇编,现在要移植到Linux下,幸好intel编译器支持Linux,这里以Ubuntu 12.04作为系统平台。首先下载你想使用的intel编译器版本,我这里下载的是intel c++ composer xe 2013 sp1 update 1http://software.intel.com/en-us/c-compilers/原创 2013-12-27 10:39:58 · 11255 阅读 · 2 评论 -
解决Linux下内联汇编的宏融合寻址问题
Windows下生成DLL时,直接使用内联汇编的宏融合(Macro Fusion)模式,可以提高效率,如__asm { movdqa xmm0, g_data0; paddw xmm0, g_data1; movdqa g_data2, xmm0;} 这里的g_data0|g_data1|g_data2都是全局变量。 类原创 2016-01-14 18:02:34 · 1987 阅读 · 0 评论