匿名用户
1级
2016-09-17 回答
不知道你这个几倍甚至几十倍的数据是怎么得来的。C语言作为一种十分接近汇编的高级语言,效率是十分高的,绝对没有你说的这么夸张。甚至以我的经验,一个好一点的C语言编译生成的代码,会略少于汇编,这个是我实际工作中得到的经验。当然,我们讨论的前提是,C语言与汇编,两者做同样的事情。
单就目标代码的尺寸来说,C语言的效率,在允许最高级别的全局优化的情况下,通常比用汇编要少一些,因为C语言编译时可以分析整个程序的结构,将所有可以节省的地方都节省下来。而人工汇编很难做到全局的优化,最多只能局部的优化。假设你的程序中有50个函数,人工很难全部优化一遍,如果调用结构有变化,所有工作要从头来过,这根本 是不可能的,而自动优化则很简单,重新编译 一下就可以了。
其实,汇编的高效主要是指的代码的执行效率高!这个主要是因为人工编写汇编,会明确知道一些C语言编译不知道的细节,说白了,是人比机器多知道一些可以优化的信息,有了这些信息,人工可以有意识的控制关键点的处理效率,从而整体上提升效率。
比如,某个循环的内部处理,你可以通过仔细分析,然后用汇编来[写,少用一个周期,循环100000次,就可以节省100000个周期。假设你把循环内部的代码数节省100个字节,但无论循环处理多少次,目标代码还是只少了100个字节。
你所谓的C语言目标代码较多,可能是这几个原因,
首先,C语言编译时有不同的优化级别,通常在调试的时候优化级别不会设定的很高,所以生成的代码会有一些冗余,这主要是为了调试方便。
其次,C语言在生成目标文件时,常会在最终的目标中链接一些启动代码,用于配置运行环境等,而汇编写的程序中,可能没有这一部分功能,所以在小程序时,会显的C语言的目标文件比较大,其实是因为它多做了好多事。这一部分,可以通过控制链接来加以控制去掉某些不需要的功能。
还有一点,C语言只按基本数据类型来操作,比如,用汇编你可以写三个字节的加法,而用C语言就很难做到这一点,只能用4个字节来做。如果你有一个中断程序要处理输入脉冲的计数,最大值需要计数1,000,000的情况,8位机用C语言来处理只能用4字节加1操作,而用汇编则可以写三个字节的加法。这种情况可能汇编确实会精简一些,但很有限。