C++/CLI的十宗罪

lanzhengpeng2 2006-11-29 03:08:26
C++/CLI的十宗罪

由于公司有大批程序员死在C/C++的内存管理上(泄露,越界),作为有先见之明的,伪程序员的老板征集了各方意见后,决定将现有的所有框架代码移植到C++/CLI下面来

。由于本人在C/C++上多花了几年功夫,自然,这个"简单"的问题就落在了我的肩膀上。用了一端时间C++/CLI后,发觉C++/CLI不是鼓吹中的那么好,特别是对于C++程序员来说,

简直是噩梦。依据MS的历史,我认为MS在VC9.0以后的版本中才能将C++/CLI实现的比较完美。(MS的历史:要在第三个版本才会比较好用,例如:VC4,VC5都不是很好,VC6我用了7

年;.NET 2002,2003也一堆问题,.NET 2005终于好用了)。
特在此总结了C++/CLI的十宗罪,罪状如下:

第一、没有全局变量
好吧,我承认“现代”的高级语言都没有全局变量,不过,实现这些高级语言的运行库都有无数的全局变量(反汇编跟踪下就知道了)——哦,只许州官放火,不许百姓

点灯。好吧,我承认没有全局变量,我还能生存,大不了晚上我不点灯不做事了。

第二、类的静态成员变量的初始化时机问题
没有全局变量是吧,那么我用静态成员变量来模拟总可以了吧。很好,顺利编译通过!但是,但是,这个静态成员变量是什么时候初始化的呢?哦,用到这个类的任何变

量/函数/实例的时候初始化的!这个到是很好,解决了全局变量的初始化顺序问题。问题是,我只不过希望静态成员变量将本类注册到类工厂去。我从来不会直接访问这个类的任

何变量/函数/实例——我只访问他的基类。这样一来,我的类工厂里空空如野,我的系统再也工作不起来了。

第三、弱智的/缺乏实际应用经验的人设计的的静态成员变量初始化地方的问题。
你能判断下面这句话是变量声明还是函数申明吗?
static int myfunc(mytype_or_myvar);
反观C++的做法:
static int myfunc;
int myclass::myfunc(mytype_or_myvar);
你会有歧义吗?

第三、静态局部变量的问题
你知道,仅仅一个“单件”,就多么的需要这个玩意!

第四、功能弱到极点的array。
其实已经很强大了,比C++的数组多了一个Resize()功能了。但是,跟std::vector比较起来,一个天上,一个地狱!好吧,我承认我对CLI不熟悉,那么,谁告诉我,

C++/CLI提供了什么样的东西,具备std::vector的功能?不要告诉我基于CLI的模板库,我严重怀疑其可工作否。

第五、value struct 和 cpp struct 在模板函数上,对"引用"的符号匹配问题
对于cpp struct应该匹配那个符号?'&'还是'%'?答案是'%'。哦,我的天哪,居然还可以使用pin_ptr<cpp struct>来取地址!实在是太伟大了!那么,我的cpp struct变

量究竟位于哪里?堆上?栈上?还是托管堆上?我迷糊了,编译器跟我一起迷糊了。

第六、模板函数的特例化问题
对于下面这样的函数
ref class myclass
{
template<typename T>
myclass % operator << (T % t){...} //函数一
myclass % operator << (mytype % t){...} //函数二
};

myclass c;
mytype t;
c << t; //式一

你认为"式一"会调用那个函数?我知道你的答案,不过你的答案是错误的,因为你是一个资深的C++程序员。当我意识到我的系统不能正常工作是源于此的时候,我很想联

系恐怖份子,购置一枚或者更多的原子弹,然后在google上找到MS总部甚至分部的坐标,然后把原子弹的目标设置好......

第七、C++和C++/CLI的代沟问题:
ref class,value class里不能放置cpp class的实例,这个我还能接受。但是,cpp class里不能放置ref class,value class的任何玩意——实例、引用、指针、

interior_ptr,pin_ptr。我怎么实现回调式的功能?不是我非要设计出回调式的功能,而是,有那么多,那么多的Win32 API是回调式的!好在我在知识的海洋中找到了
System::Runtime::InteropServices::GCHandle
不然,我定制的原子弹就会上升成为氢弹!

第八、.NET提供的类库太过于臃肿
大家知道,C/C++的CRT也就几百K,C/C++仍然实现了你所能看到的软件的绝大部分——但是,你看到的,用.NET实现的软件有几个?好吧,我承认我偷梁换柱,不过,由

于.NET库的臃肿,以致于稍微一个好听,合义的单词都被.NET用掉了。这让我不能放心用Object,String,IStream...等等作为我自己的类型的命名,我只好绞尽脑汁想别的名字—

—正如您所猜测的一样,我的英文很差,必须要借助翻译工具才能看懂C++/CLI的白皮书。这让我想出新鲜的,上口的,其他跟我英文一样差的人能看明白的单词,其难度真不啻于

用随机数拼出一个Windows啊!
随机数拼出一个Windows:这个是我一个哥们的研究课题,把N台电脑关在一个小黑屋里,让他们随机生成二进制数据,并当作程序来运行.当速度足够快或者运气足够好的时候

,生成的二进制数据刚好跟你从DB商手里买到的Window XP一样.

第九、四饼!
这个问题是由第八个问题引起的,因为有这么多,这么深的名字空间,各个名字空间下有这么多相同名字的类型名,让我不得不整

天::...::...::...::...::...::...::...::...::...::...::...::...::......
真的,四饼占了我代码的十分之一的字数。如果按字数发工资,我是乐意的,问题是,不是按字数发工资!

第十、GC不能解决内存泄露问题
首先,我们要承认GC的一个伟大壮举:GC能够在程序退出去的时候,释放所有的内存。但是,在8年前,我用C在DOS也能够办到这个功能。问题是,运行十天后,我C/C++

占用的不会释放的内存,GC也不能释放,甚至GC占用的内存还更多。因为GC分不清楚没有置空的句柄是否还有机会被再次使用。

...全文
262 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhushouqqq 2006-12-12
  • 打赏
  • 举报
回复
mark

7,774

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧