发新话题
打印

重识C++的魅力

首先谢谢yongweisun兄弟的评论!关于你说的,我觉得有几点不妥,大家一起探讨一下。
引用:
集合类在java和c#这样的语言里面是一个基本的东西,任何程序员都可以轻易的写出来。这个居然是boost的伟大特性...
1. 集合类应该不是java和c# “语言” 里的东西,而是它们的类库里的内容。
2.关于v += 1,2,3,4,5,6,7,8,9; 是因为这样的赋值方式很奇特,是使用C++的特性重载出来的。虽然C#很强大,好像目前不能这样的操作。
引用:
集合类在jc++有几大弱点,是它将来必然被淘汰的原因。
第一,兼容性差,复杂度高。
我想你所说的可能是c++的优点:c++兼容性不好,是因为c++无处不在。有很多c++开发的跨平台软件,却少见c#跨平台的软件,不是因为c#兼容性太高了,可能是因为它运行的平台太少了. (我知道有个mono)
引用:
第二,没有一个内置的内存管理框架。
c++的确没有内置的GC,不过可以使用外置的(看看HP的GC),或者如果你开发的工程浩大,可以考虑自己写一个。
c#倒是有gc, 不过好像没把内存省下来
引用:
boost在这种情况下,需要指明weakreference。也就是说,需要手工干预
boost本来提供的是几个智能指针,并不是GC.
引用:
字符串以'\0'结尾,而不是像delphi那样在字符串前面指明字符串长度。这是缓冲区溢出的根源。如果操作系统用delphi来开发,现在操作系统的安全漏洞要少一半
引用:
"这使c++不可能成为开发操作系统和硬件平台的首选语言"
?
引用:
编译速度极慢。这是拜头文件所赐
c++确实编译速度比较慢,可能需要改进。不过,与此相比,用户好像更在乎运行速度,编译慢点总比运行的时候再去编译要好些
引用:
c#只要使用一个xxx.BeginInvoke就可以了。。
而c++,java等语言就惨了,需要自己搞线程池,搞对象池,搞调用队列这些重量级的东西。既然这些东西经常用到,就该把它集成到语言本身
c++来实现这个并不难, BeginInvoke用PostMessage代替, Invoke用SendMessage代替, 然后在目标窗体上处理发送的消息即可。另外Invoke不是语言范畴的东西,即便在C#里,它也只是类库里的内容而已。
引用:
因为用过了c#之后,无论再用哪种编程语言,都会觉得很麻烦。有时候,真的希望世界上就剩c#这一种编程语言。。。。
相信我,真的也曾有过这样的想法 ...



我写这个帖子是有感而发,并不是想挑起语言大战。不同的环境需要不同的语言。c++不能适合所有的开发环境, ...

[ 本帖最后由 stormelf 于 2008-1-10 12:18 编辑 ]
采菊东篱下, 悠然见南山.

TOP

论方便,C#远没有python等脚本语言方便,那才是真正为实用发明的语言

C#再好,现在用来做共享仍然不合适。

还是觉得语言优劣的讨论很无聊

TOP

呵呵,这么认真啊。。。
感谢你提供hp的gc,不知道你用了之后结果怎么样。我听说hp这个gc是用c写的,不过似乎没有多少人用。这样的项目,我见过不止一个,但是每一个都让我失望。如果你试验过的话,希望能把结果公布一下,谈谈心得体会。据我所知,gc的实现,必须保留对象图,才能真正判别循环引用。这样的gc才有实用价值。必须是用起来完全没有限制,无需手工干预的,才是真正的gc。实现这一点,恐怕必须从编译器加以改造,仅仅靠几个库,恐怕很难。如果有这样的gc的话,我想,要么是功能不完整,要么就是使用极度繁琐。我不想再当试验品了。希望你能试验一下,谢谢
v+=1,2,3,4,5我不知道有什么用处,我只能理解成是你的冷幽默。。。。
beginInvoke绝对不像你想的那么简单。而且,并非只有窗口程序才能用beginInvoke,跟窗口无关。这是一个异步调用框架。其实现是相当复杂的。自己实现,很难做得像它一样稳定,一些jsp服务器的线程池就经常有这样那样的问题。
还有,那个_1我不认为是一种好的编程风格。你所做的,就是我说的那种,喜欢写一行代码让人想半天以找到自信的行为。你不觉得这种行为很孩子气么。。。。
的确,用c++能给人找到心理平衡。因为人总是会以为,通过辛勤劳动才得来的东西,是无比珍贵的。可惜,事实不是如此。我的firefox刚刚崩溃了,因为访问了地址为0x00000000的内存。。。。 这可是世界顶级程序员的作品,就这个样子。难道这还不足以说明语言的弊病嘛。
一个优秀一些的c#程序员,几乎可以把错误控制到0。有些c#程序员写程序,是不需要调试查错的,一般都是一次成功。
c++的确还要用,但他并不好用。用它,是因为迫不得已。我用c++是生活所迫,但是我绝对不喜欢它,更不会为它涂脂抹粉,因为我有更好的选择。我的第一选择,总是c#。
python虽然有趣,可毕竟是脚本语言,而且,它不能算是一种工业语言(没有重量级的支持)。所以不列入选择范围。
如果有同样的一个项目,一个程序员用c++,一个用c#,你以为那个人会快?难道这还不足以帮我们判断该用什么工具么?:lol
但是,无论如何,对于新手,掌握c还是必要的。有些c#不能解决的问题,c可以作为一种补充。c++,我认为用处不大。c和c#的组合何以解决win32平台的几乎全部问题了。以c#为主,以c作为补充,这是最经济的开发办法。
c#的代码保护,可以采用和c结合的办法,c写的部分,包括代码保护的功能,然后对它加壳。c#的部分,混淆一下,防止破解者直接得到源代码,基本上就可以了。精力还是要放在编程上。
本帖最近评分记录
  • w1984721 活力 +5 精品文章 2008-1-10 22:06
恨号,恨呛大!!!

TOP

本来不想跟你这种人说了,看到竟然有人还给你评分,哎,不说不行, 要不大家还看不清你的面目!

1.
引用:
你所做的,就是我说的那种,喜欢写一行代码让人想半天以找到自信的行为。你不觉得这种行为很孩子气么。。。。
本来就是在讨论问题,你竟然能把它变成人身攻击,个人素质问题。

2. 你的言论中,多处前后矛盾,本来在21楼已经指出明显的一处,没好意思写太直白,只加了一个?既然你不再乎,那就直说吧。
2.1 你声称c++不是写操作系统的首选语言,却又把“操作系统的安全漏洞”归罪到c++字符串上,真是。。。
2.2 你声称"听说hp这个gc是用c写的", 确又说"每一个都让我失望", 既然没用过,怎么就会失望了呢, 。。。

3. 你这个人说话,简直就是睁眼说瞎话,而且不带脸红的。
“不过似乎没有多少人用", 难道大家用还要跟你打个招呼, 你老几阿。睁大你的眼睛,看看都有哪些项目在使用HP GC:
mozilla 你不会不知道把,
你用c#, 不会不知道mono吧,
DotGNU
Visual Prolog 6,
GNU Objective C runtime, objective c不会不知道吧,最好知道,万一哪天你的c#程序要在mac上跑,可能需要他来帮忙啊
列几个知名的,其他的自己去http://www.hpl.hp.com/personal/Hans_Boehm/gc/看吧。

4. 你这个人说话,顾左右而言它。说不过就说不过吧,承认就结了,每个人的知识都是慢慢提高的。
4.1
引用:
beginInvoke绝对不像你想的那么简单。而且,并非只有窗口程序才能用beginInvoke,跟窗口无关。这是一个异步调用框架。其实现是相当复杂的。自己实现,很难做得像它一样稳定,一些jsp服务器的线程池就经常有这样那样的问题
你上面段话,看出来有点紧张阿,具体表现就是形容词,副词很多,名词很多,就是没有任何具体内容. 什么简单、困难、稳定、线程池、jsp服务器,你把大家都当3岁小孩了,拿几个名词出来吓唬一下。你倒是说说SendMessage和PostMessage怎么不能实现以上的功能呢?没有窗口?创建一个不就结了。COM中的STA套间就是用一个隐藏窗体,解决不了多线程调用的问题?
引用:
我试过,想达到一样的效果,很复杂,不是一两个月能搞好的
这么简单个功能,用vc十分钟就能写好的,你竟然用一两个月都搞不定 。。。

4.2
引用:
那个_1我不认为是一种好的编程风格
拜托阿,跟c#中string.Format()函数中的{0} {1}参数有什么差别?那么长个式子,你竟然能盯着个_1喋喋不休,只能说明,你压根不知道lambda表达式是用来干啥的,要不然不会说出这样的话。

5
引用:
我的firefox刚刚崩溃了,因为访问了地址为0x00000000的内存。。。。 这可是世界顶级程序员的作品,就这个样子。难道这还不足以说明语言的弊病嘛。
从你的这段言论可以看出,作为一个专业程序员(无论任何语言),你根本不不合格。因为稍微专业一点的程序员都应该知道指针(或称为引用),是个什么概念,而你却不知道!firefox崩溃根语言有什么关系?难道c#在访问null对象的成员时不会抛出异常?你不要告诉我说c#程序可以在最外层加一个try/catch,而c++却不能。

6
引用:
一个优秀一些的c#程序员,几乎可以把错误控制到0。有些c#程序员写程序,是不需要调试查错的,一般都是一次成功。
6.1 前半句没有问题,只要程序规模小,程序员编码习惯好,测试充分,这是可能的.但任何语言的程序员都是可能的,这根语言没多大关系.而往往的情况是,很多优秀的程序员同时精通多门语言.
6.2 后半句, 我想你说的意思是没有编译错误, 对于你的专业程度,佩服这个,我可以理解.

7.
引用:
如果有同样的一个项目,一个程序员用c++,一个用c#,你以为那个人会快?难道这还不足以帮我们判断该用什么工具么
打个比方反驳你: 有个人要远行,他想买个交通工具, 他喜欢Car, 所以他选择了Car并希望干什么都能用上这部Car. 有一天他犯难了, 如果出海怎么办? 如果去铺公路怎么办? 可能很多人已经知道我打得比方说的是什么了, 但对你,我还是提醒一下吧. 大海- 非windows平台, 铺路-驱动程序, c#可以吗? 你别又跟我争个没完说c#多好, 因为我知道c#有多好,所以我把它比作Car, 而不是自行车, 很快,只不过有些路他走不了。

8.
引用:
c#的代码保护,可以采用和c结合的办法,c写的部分,包括代码保护的功能,然后对它加壳。c#的部分,混淆一下,防止破解者直接得到源代码,基本上就可以了。
好像没人提到代码保护的事情。引用你自己说的话: 以炫耀 “以找到自信的行为。你不觉得这种行为很孩子气么。。。。”

最后说一句,无知没有错,不过不要用自己的无知去误导别人!

[ 本帖最后由 stormelf 于 2008-1-12 13:47 编辑 ]
采菊东篱下, 悠然见南山.

TOP

要站在客户的角度讲,什么情况用什么语言。
曾经风靡一时的拼音加加输入法在2.204版之后,就沉寂了一段时间,后来推出了用C#写的3.x版,结果出了几个版本后,又切换成用C++写,因为网上n多用户强烈要求不要用.NET,要Native的~
宁可错爱三千,不可放过一个
http://missdeer.blogspot.com/

TOP

TOP

引用:
原帖由 reika 于 2008-1-9 10:21 发表

完全看不懂,有啥好处嗫。
1楼就说了不是说有什么好处,是说(_1 + _2)(1, 2) 巧妙利用了c++的特性实现了这种功能。

如果非要说好处,可能代码比较精炼。
举个例子吧,下面一行代码用来给一个数组中所有元素赋值:
复制内容到剪贴板
代码:
for_each(v.begin(), v.end(), _1 = 1);
下面一行代码实现对一个数组降序排序:
复制内容到剪贴板
代码:
sort(v.begin(), v.end(), *_1 > *_2);
采菊东篱下, 悠然见南山.

TOP

严重支持
本来想叫"我是蛮夷我怕谁",不过名字太嚣张了,俺们是粗人,所以大家不要怕我,谁要是怕我,我就用美刀砍谁!

TOP

抗议该死的C++

TOP

TOP

发新话题