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

menzi11 2011-12-03 05:53:39
我确实是不明白为何速度要求高的领域总是使用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++,为啥还一定要自己去模拟面向对象特性??????
...全文
4704 87 打赏 收藏 转发到动态 举报
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
tofu_ 2013-03-24
  • 打赏
  • 举报
回复
引用 86 楼 Kaile 的回复:
你可以inline虚函数啊! 这句话我有点疑问,虚函数是运行时才决定哪个的,应该编译时无法内联
虽然使用虚函数是为了能在不知道具体类型的情况下也能执行正确操作,但是并不是所有情况下都是不知道类型的。在那些知道类型的情况下依然有机会inline。 我只想说一句,不懂C++、不会用C++的,真的有资格说C++低效么?就像一个不懂书法的人,看到别人的草书,还笑话别人字写得差。
Kaile 2013-02-23
  • 打赏
  • 举报
回复
你可以inline虚函数啊! 这句话我有点疑问,虚函数是运行时才决定哪个的,应该编译时无法内联
公子骏 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 84 楼 的回复:]

C++一点也不比C差,用得着一直讨论虚函数损失的那么一点点效率吗?只想说,现在手机都快4核了。。
[/Quote]
还是那句话,都4核了,还不如用java写,干嘛用C++那么遭罪
paschen 版主 2012-04-28
  • 打赏
  • 举报
回复
C++一点也不比C差,用得着一直讨论虚函数损失的那么一点点效率吗?只想说,现在手机都快4核了。。
menzi11 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 80 楼 roc1005 的回复:]

一看就知道有些人不懂汇编

比较C和C++编译后的文件大小(汇编代码量)就知道效率差多少了
[/Quote]

您老还活在16位汇编的世界吧..
公子骏 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 77 楼 wwwllg 的回复:]

引用 3 楼 mitiao 的回复:

只要使用适当,可以忽略不计


写逻辑复杂的,事务处理方面,C++还是比较方便,开发效率高。

执行效率我关心个屁。
[/Quote]

说真的,做复杂设计,我不如用Java写。
sniffer12345 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 80 楼 roc1005 的回复:]

一看就知道有些人不懂汇编

比较C和C++编译后的文件大小(汇编代码量)就知道效率差多少了
[/Quote]
真有意思,这个方法真是令我耳目一新啊
roc1005 2012-01-06
  • 打赏
  • 举报
回复
一看就知道有些人不懂汇编

比较C和C++编译后的文件大小(汇编代码量)就知道效率差多少了
ningbinzhang 2012-01-05
  • 打赏
  • 举报
回复
开发出来的新语言,一般都是为了在以前语言的基础上添加某些优点才去开发它的。如果没有优点那不是闭门造车吗?
C++的优点一是增加了类的使用,二就是模板。
我感觉这两个功能都是基本都是为了复用才被开发出来的。
TIP_fei 2012-01-04
  • 打赏
  • 举报
回复
个人觉得用C编写嵌入式的软件好些
对于类似于PC软件的开发,用C++好些

嵌入式用C方便调试,节约空间
PC软件用C++可以比较快速的开发,大可不必为空间烦恼
yuqangy 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 dahuaixiaohuai 的回复:]

说C++比C慢的原因我认为有几个原因
1、熟练于C开发程序员不愿意使用C++开发,因些会找一些C++性能差的原因,做为不采用C++的理由,这种现象很常见,就像C++程序说JAVA,JAVA程序员说C++的一样,因为不喜欢不愿意,我就得找个理由。
2、使用C++中的特性,导致原本很简单的问题,用复杂的方法去实现,主要是为了体现做为牛人的心理安慰,“看我多历害,这么难的东西都会用”。
3、为设……
[/Quote]
一看你就不是做C++的, 套用设计模式是为了体现自己是牛人?复杂的方法实现简单的问题是心里安慰? 你有没有想过日后的扩展和维护。当然排除那种一次开发的项目。

很多时候我们用RELEASE版本C++编译器都会帮我们优化,各方面的优化都有呢,再者,C++的兄弟可以往下兼容开发C项目,C的兄弟还能往上兼容么。。这是一个利益的社会

还有。。 inline我记得C标准也有吧
q8810783 2012-01-04
  • 打赏
  • 举报
回复
同样的一个项目,同一个开发人员,如果他用c++写一遍,再用c写一遍。
我相信2套代码绝对是完全不一样的。虽然你可以说c++也可以用c的方式写。但是你很清楚,用了c++你的代码肯定大部分会是c++风格。
而c中,有些必要的场合可以模拟c++面向对象的思想,但那并不是整个项目的全部,除去这部分,其他的地方还是能很直接的去操作硬件,用c的方式。如果单纯为了那点面向对象的功能而去使用c++,那么其他部分反而会有点不伦不类。不要说什么c++是集合。
用c的地方,代码一般会经常重构,需要c++的那些特性吗?c与c++早就是2种语言,不要总以为某个小函数,某个小功能c++能与c同样的实现就觉得c是c++的子集了。
当编译器不停为你添加代码的时候,最后的image太大而无法烧制的时候,那些所谓的特性反而成了拖累。
c与c++场合不同,谁劣谁优,都是对特定场合而言的。
「已注销」 2012-01-04
  • 打赏
  • 举报
回复
mark。暂时还不懂这些深层次的东西。
xiaonong 2012-01-04
  • 打赏
  • 举报
回复
1988年我在DOS下用C写这段代码的16位版本的时候,手上还没C++编译器呢!

赵大师,很牛X
UDX协议 2012-01-04
  • 打赏
  • 举报
回复
C++和C的那点区别,现在的CPU完全可以忽略,在PC上。


如果是嵌入式的话,当MEM很小时,C优势明显。
UDX协议 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mitiao 的回复:]

只要使用适当,可以忽略不计
[/Quote]

写逻辑复杂的,事务处理方面,C++还是比较方便,开发效率高。

执行效率我关心个屁。
fineday2011 2012-01-03
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 strongc1969 的回复:]

觉得这个问题意义不是很大

做复杂程序,当然C++开发效率高
执行效率,不见得哪个高
使用C++完全可以按照C的写法做
自己写的C代码,未必有C++库效率高
[/Quote]


恩,c++库很牛~ 再者,存在即合理,学好一门语言总会有其所用之处~
warren258 2012-01-03
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 xhhxx 的回复:]

少林、武当又不和了?
[/Quote]
好吧,我属于明教看热闹的。。
翅膀的梦想 2012-01-02
  • 打赏
  • 举报
回复
其实都差不多啊
frogoscar 2012-01-01
  • 打赏
  • 举报
回复
两个都喜欢~~~~~~~~~~~~~~~~
加载更多回复(65)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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