Huge Lemon的博客

C语言效率问题及其他相关内容

2020-01-31

来源:UESTC考研群

  • 编译器可以将代码编译为汇编语言,然后转换为机器语言,并且编译器可以在编译时进行优化,例如gcc可以进行五级优化

  • 采用宏去定义一些函数,提高效率 比如 #define MAX(x, y) ((x) > (y) ? (x) : (y))

  • 可以使用位操作来替代乘法除法 比如计算机网络中进行CRC检验

  • 可以在程序效率低的地方嵌入汇编语言提高程序效率

  • 可以使用指针直接操作内存,提高效率

  • 可以使用内联函数(C99标准添加,之前宏定义)

  • 可以使用寄存器变量(register),提高变量存取速度

  • 复合的赋值运算符的使用,比如 i -= 1 效率大于 i = i - 1,可以提高程序的编译效率

  • 自增自减运算符的使用,比如 i++i--


1. 从C语言执行效率方面,简述C语言采取了哪些措施提高执行效率。

① 使⽤指针:有些程序⽤其他语言也可以实现,但C能够更有效地实现;有些程序⽆法⽤其它语言实现,如直接访问硬件,但C却可以。正因为指针可以拥有类似于汇编的寻址方式,所以可以使程序更高效。

② 使⽤宏函数:宏函数仅仅作为预先写好的代码嵌⼊到当前程序,不会产生函数调⽤,所以仅仅是占⽤了空间,而使程序可以高效运行。在频繁调⽤同⼀个宏函数的时候,该现象尤其突出。函数和宏函数的区别就在于,宏函数占⽤了⼤量的空间,而函数占⽤了时间。
宏函数的例⼦:

③ 使⽤位操作:位操作可以减少除法和取模的运算。在计算机程序中数据的位是可以操作的最⼩数据单位,理论上可以⽤”位运算”来完成所有的运算和操作。灵活的位操作可以有效地提高程序运行的效率。

④ 循环嵌套中将较长循环设为内置循环较短循环设为外置循环,以减少CPU跨切循环层的次数,提高程序的运行效率。(操作系统页⾯置换相关,减少页⾯置换次数)

⑤ 将汇编指令嵌⼊到C语言程序中,汇编语言是效率最高的计算机语言,因此为了获得程序的高效率,可以在C语言程序中嵌⼊汇编,从而充分利⽤高级语言和汇编语言各⾃的特点。

⑥ 在C语言程序中可以调⽤系统API,接近底层,从而提高程序的运行效率。

⑦ ⼀般情况下,C语言源程序中的每⼀行代码都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中⼀部分内容进行编译。此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译

2.请简述C语言的隐式类型转换发生的四种情况,并说明每种情况如何转换。

(注:这⾥⾯还有个⼩题,float如何四舍五⼊转化成int)

算术运算式中,低类型能够转换为高类型。
赋值表达式中,右边表达式的值⾃动隐式转换为左边变量的类型,并赋值给它。
函数调⽤中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋给调⽤函数。

3. 数组越界会产生什么后果?

越界访问有可能把数据放到已经存储了重要数据的内存单元,也就是改写了本来不许改写的数据,如果这个数据是系统的重要内容,有可能导致系统运行紊乱甚⾄是崩溃。当然如果这个数据并不重要,那么越界访问的后果就不明显或者是没有影响。避免的办法是对数组的下标严格检测,判断数组下标是否越界。⽤指针访问数组时要注意判断指针的指向是否已超过数组下标的最⼤值。

4. 值传递和地址传递

值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的⼀个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

5. C语言中,常量存储在哪里?静态局部变量和静态全局变量存储在哪里?

变量类型 存储区域
常量 常量区
静态局部变量 全局数据区
静态全局变量 全局数据区
Tags: C/C++
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏