读书人

小弟我确实是不理解C++比C慢在哪

发布时间: 2012-05-01 12:48:58 作者: rapoo

我确实是不理解C++比C慢在哪
我确实是不明白为何速度要求高的领域总是使用C而不是C++,
因为我一上来就是学的C++,可能对C的开发意识不太清晰,
但我从事的也是运算密集型软件的设计,所以有此问题.
这里并不是讨论C++比C语法上怎么怎么样,或者设计思路上怎么怎么样,
单从速度来讲,我实在想不出C++有那么致命的速度缺陷.先别急着骂街,请看理由:

C++比C多的无非就是面向对象的一些支持,对于类来说,如果不存在虚函数的话,
类中数据的使用和C结构体是完全等同的,从速度到大小都一样.类中的函数也不是
存在对象里的,访问起来和C的函数完全完全一样,无非就是多个this指针.问题是
C里面你也得传个对象指针进函数不然函数上哪知道你要处理的是谁啊?有人说
我就是死活不传this指针,那你可以使用静态函数啊,效率完全相等.再不济可用用__fastcall直接寄存器传参更快啊.

如果考虑虚函数,那确实C++比C多访问一次虚函数表降低了效率,问题是你可以让
需要极限速度的地方不用虚函数啊,带有虚函数的类中非虚的函数还是和C中效率一致啊
就算一定要使用虚函数,那么多一次指针访问无非是几个时钟周期的事情,难道谁编程有傻到
一秒钟访问一个虚函数几亿次吗???

当然,虚函数访问会带来分支缓存预测错误的可能,这是不可避免的.也确实是虚函数降低效率的
最大问题,可是,编译器的release版本,只要你不是用TC,一般都会保持两套虚函数副本,一套是
虚函数,一套不是虚函数,当编译器可以确定某个场合的虚函数具体指向谁时,它就不会在此
场合调用虚函数副本,而是直接调用非虚函数的副本.如此一来,虚函数的效率和普通函数那真是
一样一样的.

综上所述,我实在想象不出什么情况下,会出现大量调用一个运行期才能确定的函数那么多次以至于
虚表访问影响了效率??只要是编译期能确定的函数,无论虚不虚,效率都等同于C啊!实在信不过
编译器的,你可以inline虚函数啊!

再看看运行时类型转换,确实也存在虚表访问和分支预测错误的可能,但同理的,
当编译器能确定当前对象到底是什么类型时,会在编译期就将虚函数和对象指针的类型固定下来.
一个运行期才知道指针类型的对象,居然会调用那么多次以至于虚表访问影响了效率?
我认为这样做本身就是设计思路有问题.


其他一些特性,包括异常处理,虚继承确实会影响速度,这个我承认.有人说我的目标平台
就1k内存虚表开销承受不起这我也可以理解.关键是你可以不用那么多特性啊.
哪个功能影响了速度和大小,就不用哪个功能不就得了?

当然,有些场合面向过程倒比面向对象合适,有些场合只能用C,这些不算.我最理解不能的,
是有不少人用C来模拟面向对象,这个我完全不能理解,模拟出来的又麻烦又没效率,和造轮子有什么
区别? 用汇编模拟面向对象我能理解,因为除了HLA什么的,没有面向对象的汇编.
但C明明有面向对象的C++,为啥还一定要自己去模拟面向对象特性??????

[解决办法]
说C++低效的原因:

1.按值返回对象时效率不高(新标准已经改进);
2.虚函数;
3.面向对象,复用技术等有时会牺牲一点效率;
4.学习周期长,低效(如果这个算的话,其实我觉得这个最主要)。

个人见解。。。
前三个硬伤。第4个重伤。。。




[解决办法]
c更适用于底层一些。

C++由于oo思想的存在,
抽象层次高一些,对于一些简单、直接的工作任务,没有必要。
[解决办法]
只要使用适当,可以忽略不计
[解决办法]
1、由于继承的存在,c++的对象模型比c要复杂得多,复制的开销比c多得多;

2、虚函数,虚基类,增加了指针的间接操作;

3、自定义复制构造函数和自定义复制赋值运算符重载,这是影响效率的一个主要原因;

4、不恰当的类设计;

5、对类的滥用,这是重要原因。c++是一个多范式语言,类并非适用于任何情况,要视情况而定。
[解决办法]

探讨
我确实是不明白为何速度要求高的领域总是使用C而不是C++,
因为我一上来就是学的C++,可能对C的开发意识不太清晰,
但我从事的也是运算密集型软件的设计,所以有此问题.
这里并不是讨论C++比C语法上怎么怎么样,或者设计思路上怎么怎么样,
单从速度来讲,我实在想不出C++有那么致命的速度缺陷.先别急着骂街,请看理由:

C++比C多的无非就是面向对象的一些支持,对于类来说,如果不存在虚……

[解决办法]
C++的一个重要之处在于"复用--reuse",即一个开发结束后,另一个类似的开发可以不必从头开始,无论是分析、设计、开发、调试,都可以在前一个开发的基础上利用“继承(最主要的)、改造(部分的)、创新(极少的)”的方式进行,体现出OO技术的优势。
OO技术实际包括“面向对象分析OOA、面向对象设计OOD、面向对象编程OOP、面向对象测试OOT”,C++只是编程中的工具,它在OO技术中的作用,是C不能取代的。

从另一角度上说,一个极其具体、针对性极强的开发,开发量估计不大,OO技术可以说就是杀鸡用牛刀。
而学习C++的过程就是杀麻雀用电锯,例子不可能大、但类-对象又不能少
[解决办法]
探讨

C++的一个重要之处在于"复用--reuse",即一个开发结束后,另一个类似的开发可以不必从头开始,无论是分析、设计、开发、调试,都可以在前一个开发的基础上利用“继承(最主要的)、改造(部分的)、创新(极少的)”的方式进行,体现出OO技术的优势。
OO技术实际包括“面向对象分析OOA、面向对象设计OOD、面向对象编程OOP、面向对象测试OOT”,C++只是编程中的工具,它在OO技术中的作用,是……

[解决办法]
探讨

说C++低效的原因:

1.按值返回对象时效率不高(新标准已经改进);
2.虚函数;
3.面向对象,复用技术等有时会牺牲一点效率;
4.学习周期长,低效(如果这个算的话,其实我觉得这个最主要)。

个人见解。。。
前三个硬伤。第4个重伤。。。

[解决办法]
面向对象就是C++低效的本质,当然一个牛逼的C++程序员比很多C程序员编写的程序更高效
------解决方案--------------------


现在有点分不清C和C++的区别

写代码都是混合着用
[解决办法]
两者和用
[解决办法]
LZ及时结贴是重要的……
[解决办法]

探讨
引用:

说C++低效的原因:

1.按值返回对象时效率不高(新标准已经改进);
2.虚函数;
3.面向对象,复用技术等有时会牺牲一点效率;
4.学习周期长,低效(如果这个算的话,其实我觉得这个最主要)。

个人见解。。。
前三个硬伤。第4个重伤。。。

不认同第4个,说它低效的话,不如说是你用得低效吧?我就是学C++的

[解决办法]
因为c++的精华,继承,多态
[解决办法]
没感觉到什么大的差别。
探讨
现在有点分不清C和C++的区别

写代码都是混合着用

[解决办法]
补充一点:
c++每当对象产生和消亡都有构造和析构函数
[解决办法]
我是没找到什么可信的证据证明现代C++编译器的目标程序比C编译器的目标程序普遍具有更低的运行期效率。相反,inline等特性使C++编译器至少比C89编译器具有更自由的优化机会,产生更快的程序。
如果使用相同的特性,C++程序一定比C的慢就是胡说八道。
至于用C来模拟面向对象(C++一样可以),在继承上的对象模型比较自由。涉及一些成员指针的操作受限严重(除非不考虑兼容性),模拟的话也可以避免这点。只不过一般而言比起编译器的实现的而言,模拟要么低效要么不够通用,而且代码量显然比较大;这样除了一些特定的场合,是没多大意义。

[解决办法]
探讨

补充一点:
c++每当对象产生和消亡都有构造和析构函数

[解决办法]
探讨

说C++低效的原因:

1.按值返回对象时效率不高(新标准已经改进);
2.虚函数;
3.面向对象,复用技术等有时会牺牲一点效率;
4.学习周期长,低效(如果这个算的话,其实我觉得这个最主要)。

个人见解。。。
前三个硬伤。第4个重伤。。。

[解决办法]
探讨

引用:

说C++低效的原因:

1.按值返回对象时效率不高(新标准已经改进);
2.虚函数;
3.面向对象,复用技术等有时会牺牲一点效率;
4.学习周期长,低效(如果这个算的话,其实我觉得这个最主要)。

个人见解。。。
前三个硬伤。第4个重伤。。。
很有同感,但是楼主写得很好。

读书人网 >C++

热点推荐