我确实是不理解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++,为啥还一定要自己去模拟面向对象特性??????