COM是一个更好的C++
作者:网络转载 发布时间:[ 2014/7/4 14:07:18 ] 推荐标签:COM C++ net
昨天看了《COM本质论》的第一章”COM是一个更好的C++”,觉得很有必要做一些笔记,于是整理成这篇文章,我相信你值得拥有。
这篇文章主要讲的内容是:一个实现了快速查找功能的类FastString,在一个小小的需求之后,慢慢的演变成一个COM组件的过程。
类FastString实现了一个快速查找字符串的功能,快到时间复杂度是O(1),我们先不管作者是怎么实现的,估计是通过空间换时间。由于这个类查找字符串很快,于是作者把这个类当做一个产品,以源码的方式卖给需要的厂商,厂商用后感觉很好,但有的厂商想要获得字符串长度的功能,他们觉得strlen(str)速度太慢,毕竟这个函数获取字符串的长度是线性的,时间复杂度是O(N),于是作者决定修改他的FastString,其内心一直在告诉自己:我的FastString必须是Fast。
我们先来看看作者FastString的样子:
class FastString
{
public:
FastString(const char* str);
FastString(void );
int Find (const char* str );
private:
char* m_str ;
};
|
可别小看这个类,它查找字符串可快了(我也不知道为什么它他妈的这么快)。聪明的作者听了厂商的需求之后,很快的想到了很好的解决方案,通过一个变量len来存字符串的长度,通过一个函数Length返回变量len,时间复杂度可是O(0)哦,于是作者很快的实现了厂商的需求,大概如下:
class FastString
{
public:
FastString(const char* str);
FastString(void );
int Length ();//新增的
int Find (const char* str );
private:
char* m_str ;
int len ;//新增的
};
|
在经过天衣无缝的测试之后,作者骄傲的将他的作品分发给了愿意再次掏钱的厂商,厂商用了很是火大,出现了各种莫名其妙的问题,在被各个厂商咆哮之后,作者发现了他的作品的缺陷,于是决定走上COM之路。
我们先来看看厂商用了作者的FastString之后为什么挂了呢?
厂商们拿了作者的源码之后,以源码的方式和自己的其他代码一起编译成一个DLL文件,然后让自己的产品升级,升级是简单的覆盖这个DLL文件,于是厂商的产品升级之后挂了。因为FastString可能在多个DLL中多个文件都实例化了,在这些DLL中FastString占用4个字节的内存,而新版本的FastString占用的是8个字节的内存,厂商只覆盖了FastString所在的DLL,而没有覆盖所有使用了FastString的DLL,由于FastString所在的DLL创建FastString是8个字节,而其他DLL中是4个字节,如果跨库传递FastString,将一个4字节的对象当做一个8字节的对象来用,这还不挂。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11