×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

C比C++快吗

本文发表在 rolia.net 枫下论坛首先声明,这是一个无聊的话题,绝不是什么学术研究。我本人没有抱严肃的态度,只是因为看见些奇谈怪论有些看不下去。
起因是这样一个论断:In the real world, C and C++ are different roles. C is faster than C++ ON SYSSTEM LEVEL for the reason that C doesn't have any the runtime feathers which are very important to C++。
我就奇了怪了,C怎么就能比C++快。语言之间的差异主要在描述能力上,性能上有差别主要是看不同的实现。同样是Basic,编译型远远快过解释型;同样是C,不同厂家的编译器、使用不同的编译选项,会有不同的性能。那C怎么快过C++的?
这位仁兄解释了半天也说不清楚,最后急了眼了终于祭出这个说法的原始出处,热烈欢迎:
http://www.eventhelix.com/RealtimeMantra/basics/ComparingCPPAndCPerformance.htm
恭请各位移驾,先去读读那篇文章,然后再回来。

那位老大是从4个方面论述的。
第一,C++的method多传递了一个指向当前对象的指针,所以might appear to be a big performance overhead。
多一个参数,就能有BIG overhead?翻译成汇编也不过就是前面多个push后面多个pop,怎么就BIG了?不知道他的逻辑是什么。不过这不重要,重要的是,指向当前对象的指针如果说作为一个隐含参数的话,它也是一个final的参数,在method内部是不会被改变的。也就是说,聪明的编译器完全可以不把它放进stack中!!这个overhead可能存在,但只存在于笨的编译器中,并且即使存在也不是什么big overhead。

第二,Object Construction
这个我刚开始没看懂,他说sometimes this might be an addition overhead。后来看懂了,他说This overhead can be reduced by defining the constructor inline。也就是说,这个overhead是一次函数调用的开销!也就是说,C可以直接写malloc而C++是一个函数调用!疯了... 如果这也叫C的速度优势的话,那写程序不要写函数调用,从头写到尾速度最快了!!
唉...编译器的优化可以搞定的东西。

第三,Object Destruction
这叫一个牵强啊!这个所谓的overhead是建立在C++的程序员写了不必要的distructor之上的。

第四,Static Access
恩?奇怪,他并没有说C++的overhead在哪,只说C++中这个method和class关联C中不关联。这倒是没有错,但是这个关联只是对编译器来说的,runtime没差。

好像还有之二。懒得看了,看不看都是类似的牛角尖。

关于第一点,如果哪位大侠比我还闲,可以把C++程序编译以后看看是不是真的多了个参数,开优化不开优化、不同的编译器有木有差别...如果还有时间,看看有没有选项把短的constructor自动inline。我自己没有这个条件,不好意思,我连编译器都没有,八百年没写C++啦更多精彩文章及讨论,请光临枫下论坛 rolia.net
Report

Replies, comments and Discussions:

  • 工作学习 / 专业知识杂谈 / C比C++快吗
    本文发表在 rolia.net 枫下论坛首先声明,这是一个无聊的话题,绝不是什么学术研究。我本人没有抱严肃的态度,只是因为看见些奇谈怪论有些看不下去。
    起因是这样一个论断:In the real world, C and C++ are different roles. C is faster than C++ ON SYSSTEM LEVEL for the reason that C doesn't have any the runtime feathers which are very important to C++。
    我就奇了怪了,C怎么就能比C++快。语言之间的差异主要在描述能力上,性能上有差别主要是看不同的实现。同样是Basic,编译型远远快过解释型;同样是C,不同厂家的编译器、使用不同的编译选项,会有不同的性能。那C怎么快过C++的?
    这位仁兄解释了半天也说不清楚,最后急了眼了终于祭出这个说法的原始出处,热烈欢迎:
    http://www.eventhelix.com/RealtimeMantra/basics/ComparingCPPAndCPerformance.htm
    恭请各位移驾,先去读读那篇文章,然后再回来。

    那位老大是从4个方面论述的。
    第一,C++的method多传递了一个指向当前对象的指针,所以might appear to be a big performance overhead。
    多一个参数,就能有BIG overhead?翻译成汇编也不过就是前面多个push后面多个pop,怎么就BIG了?不知道他的逻辑是什么。不过这不重要,重要的是,指向当前对象的指针如果说作为一个隐含参数的话,它也是一个final的参数,在method内部是不会被改变的。也就是说,聪明的编译器完全可以不把它放进stack中!!这个overhead可能存在,但只存在于笨的编译器中,并且即使存在也不是什么big overhead。

    第二,Object Construction
    这个我刚开始没看懂,他说sometimes this might be an addition overhead。后来看懂了,他说This overhead can be reduced by defining the constructor inline。也就是说,这个overhead是一次函数调用的开销!也就是说,C可以直接写malloc而C++是一个函数调用!疯了... 如果这也叫C的速度优势的话,那写程序不要写函数调用,从头写到尾速度最快了!!
    唉...编译器的优化可以搞定的东西。

    第三,Object Destruction
    这叫一个牵强啊!这个所谓的overhead是建立在C++的程序员写了不必要的distructor之上的。

    第四,Static Access
    恩?奇怪,他并没有说C++的overhead在哪,只说C++中这个method和class关联C中不关联。这倒是没有错,但是这个关联只是对编译器来说的,runtime没差。

    好像还有之二。懒得看了,看不看都是类似的牛角尖。

    关于第一点,如果哪位大侠比我还闲,可以把C++程序编译以后看看是不是真的多了个参数,开优化不开优化、不同的编译器有木有差别...如果还有时间,看看有没有选项把短的constructor自动inline。我自己没有这个条件,不好意思,我连编译器都没有,八百年没写C++啦更多精彩文章及讨论,请光临枫下论坛 rolia.net
    • C可以直接写malloc而C++是一个函数调用???你的理解在这附近有问题. BY THE WAY,我用C,就基本不用MALLOC.需要动态分配内存的时候,很多时候都是自己搞定.
      • 有问题是啥问题?他说那个overhead可以通过把constructor inline来避免的,你怎么解释?
        • 要解释清楚挺费劲,你就自己琢磨吧,如果其它C++/C真正大侠看不过眼,就请指教吧.
          • 嘿,你看不懂就说看不懂,何必呢。不管怎样,他原文是说了 This overhead can be reduced by defining the constructor inline的吧?那我如果care性能到有病的程度,把constructor给Inline了不就得了吗,并不比C慢那
            • 1.construct have nothing to do with malloc. 2. c don't have construct at all. and your logic is such a mess around this issue.
              • 你真的是没看懂他那个例子。再看看,只要对比下C++的constructor和翻译到C的constructor就行了
                • 我根本就没看,以前就读过类似文章,你这篇,一看那调调就知道抄的了.
            • when you inline, how about inheritance.
              • 没想过。但是至少我在C++里面可以象C一样,我用struct,不用继承。别忘了C++是C的超集
    • 我不懂C++,但至少我知道 this 是必须传入函数的,否则动态连编有可能就找不到object.
      • 哦,我糊涂了。如果是用C来实现,同样需要一个struct,函数需要显式地传入一个指向struct的指针。C里面这个指针是少不了的,不然同样找不到
    • new 分配内存不是编译器就可以优化的,可能是调用这个new,也可能调用那个new。
      • 我没说优化new,请再看看
        • "唉...编译器的优化可以搞定的东西。"
          • 优化是说inline。他说的overhead不是在new上,是在函数调用上。
    • 据我所知,C++的性能比汇编要快5倍,更别说C了。 99%的实时操作系统都是用c++写的。
      • 没错,另据我所知,Microsoft的下一代XP的核心将用Basic编写,而下一代的GEFORCE 3D CPU的核心也将由Perl改写。。。
        • 下一代XP?xp sp3?
          • no, 下一代XP叫YP.......你叫什么真啊~~:)
      • 很感兴趣的说,您能举几个例子吗?
      • 别扯!
    • 我有个蠢问题:文中所说的C++编译器是用C写的还是汇编写的?
      • c++,c ,汇编都有吧
    • 我觉得文章是有道理的. c++慢在1.每次操作class需要寻址this 2. 多态的时候每次要寻址指针数组 3.使用try/catch. 不过牺牲这一点点的性能而能换来比C高很多扩展性和多态,我觉得是值得的
      • 1.如果用struct,那么函数也还是需要一个显式的指向struct的指针,对吧?2,3是有道理的,你可以说C++的有些特性会损失一些性能,但是不能因此说C比C++快,因为C++毕竟是C的超集,在C++里面我也可以不用多态不用继承不用try/catch
        • 如果你不用多态不用继承不用try/catch那么c++和c性能我感觉应该是差不多的。其实你用gcc一样可以编译c++的代码,只有需要用到stl和template的才用g++.例如我自己就从来不用try/catch,能用memcpy就不用std::string
          • 如果你把C++当作C来用,性能当然是差不多.那就别给OO贴这么多金了.这个STL和TEMPLATE一上,C++好处和坏处就一块来了.
            • 搞笑,我框架和设计模式用c++,内部一些小函数用c这有什么问题?难道用c++就不允许用pinrtf? STL/Template使用的时候几乎等同于inline,他们的坏处是什么你倒是说说啊
              你到底用过STL和模板没有,
              如果没有的话请你shutup
              • .. when I have time and you calm down. I will give you some drawback of template.
                ..
        • C++ 还可以嵌套汇编呢,这样扯没什么意思。OO的目的是什么,不是为了提高效率的。太追求效率,别人会看不懂你的程序
    • 本人最近做的一个项目, 由于硬件的内存很小 <2M, 用C写程序时连STAND LIBRARY都不能用. LINUX KERNEL 的源代码也没有用C的标准库.
      • windows 也没有.
        • 你这么热爱C, 喜欢挑战的人,还是玩FPGA更刺激. 介绍一个网站: http://www.jopdesign.com/
          • 多年前就玩了,从硬件到软件都是自己做的。208脚呢!
            • 把10-20个RISC CPU放到一个百万GATES的核, 模拟大型计算机做并行计算的玩过吗?我朋友玩过, 我没有.
              • 百万GATES我用过,设计一个比一般CPU简单的东西.一下子就给我用完了.但是百万MACRO我就没有用过了.
                • 百万gates的FPGA的资源并没有真的是一百万,要少很多。很多小的CPU,放在百万门级的FPGA绰绰有余,比如Altera的NIOS。如果单单想用光FPGA的资源,很容易,几十行的代码就可以。另外,在FPGA里,什么是MACRO?这个我没有听说过。
                  • 中文叫做宏单元.
                    • 宏单元是CPLD结构里的东西。
                      • 我把LE也认为是宏的一种..你如何称呼LE的?真不知道其中文名字,也就把这个破烂英文也忘悼.真不明白人们为什么这么喜欢给本质一样的东西起各种怪名字.
                        I am old style people. I changed slowly after used a term for long and people change the name of the same thing.
                  • 我这个人有个贱毛病,很不喜欢用CODE LIBRARY,一般情况下,只要是力所能及,都是自己写CODE.
                    • 是不是很久没有接触HDL设计了?我还没有听说过FPGA设计用CODE LIBRARY的呢。我说的意思是,用verilog或者vhdl可以用很少的代码写出占用很多资源的逻辑来,比如,一个很宽的加法器。
                      • The last time was 2 year ago. I didn't remember the name of such ieee library....etc.. I used VHDL. for me, 1个很宽的加法器, is the same as a narrow one. Because I can write one myself. It is not difficult at all.
                        I can design any bits of carry-advanced adder. Of course, using library can save a lot of time. However, sometimes, for the same adder function, I will test 3 solutions and chose the best performance.(Space/speed).

                        And when you write the code yourself, you will have flexibility.

                        It is sad for so many intelligent use too much library and turn themself as a slave of library and 3rd party tools.
      • Sorry, flash disk less than 2m, memory is around 780k
        • sorry. I mean windows kernel.
    • No. It totally depends on who writes the code and which compiler is used.
    • C和C++都略知皮毛, 个人感觉C是程序员算好地址让机器去读数, 又快又省内存. OO是COMPILER, 自动生成地址, 慢而且不经济, 但是准确率高,程序简单. 象SmallTalk其实是很不错的OO语言,可惜超前了. 现在机器快了, 不在乎程序速度了.