《C陷阱与缺陷》&《C专家编程》5

来源:互联网 发布:网络购物诈骗名词解释 编辑:程序博客网 时间:2024/06/06 09:39
2016年11月22日 22:41:24
——————————————《C陷阱与缺陷》————————————————

1.预处理的重要性:
     (1)方便查找和修改统一的常量
     (2)用宏定义部分表达式,减小系统开销

2.宏不是函数
     因此在用宏定义表达式时,最好把每个参数都用括号括起来
          如: #define abs(x) (((x) > 0) ? (x) :- (x))

3.ANSI C标准中有几个标准预定义宏(也是常用的):

   __LINE__:在源代码中插入当前源代码行号;

   __FILE__:在源文件中插入当前源文件名;

   __DATE__:在源文件中插入当前的编译日期

   __TIME__:在源文件中插入当前编译时间;

   __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

   __cplusplus:当编写C++程序时该标识符被定义。

     编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。

     参考博客:http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html

——————————————《C专家编程》————————————————

1.为什么要学习运行时系统?
     ①它有助于优化代码,获得最佳的效率
     ②它有助于理解更高级的材料
     ③当陷入麻烦时,它可以使分析问题更加容易

2.   a.out  全程:assembler output(汇编程序输出)
     实际上是:链接器输出

3.在UNIX中,段表示一个二进制文件相关的内容块。
   在Intel x86中,段表示一种设计的结果。在这种设计中(基于兼容性)地址空间并非一个整体,而是分成一些64K大小的区域,称之为段

     在Linux中,输入size a.out 会告诉文件中三个段的大小(文本段,数据段,bss段)
     

     文本段:存放可执行文件的指令
     数据段:初始化后的全局和静态变量
     bss段:Block Started by Symbol(由符号开始的块),只保存没有值的变量,所以不需要保存这些变量的映像
                    在运行时,bss段的大小记录在目标文件中,但bss段并不占据目标文件的任何空间

     局部变量并不进入a.out,它们在运行时创建

注意:
     (1)数据段保存在目标文件中
     (2)BSS段不保存在目标文件中
     (3)文本段是最容易受优化措施影响的段
     (4)a.out文件的大小受调试状态下编译的影响,但段不受影响

4.由于段是一片连续的虚拟地址,相邻的段被结合,因此数据段和BSS段的整个区段通常统称为“数据区”

5,堆栈的作用:
     (1)堆栈为函数内部声明的局部变量提供存储空间,即自动变量
     (2)进行函数调用时,存储与此右边的一些维护性信息
                    这些信息成为堆栈结构或者过程活动记录
                         内容包括:①函数调用地址 ②任何不适合装入寄存器的参数 ③一些寄存器值的保存
     (3)堆栈也可以被用作暂时存储区

6.为什么不能从函数中返回一个指向该函数局部自动变量的指针?
          当函数结束后,变量不复存在,它所占用的堆栈空间被回收,可能在任何时候被覆盖,这样指针就失去了有效性,成为“悬垂指针”

7.过程活动记录并不一定存在于堆栈中
          尽可能地把过程活动记录的内容放到寄存器中会使函数调用的速度更快,效果更好。
          CPU拥有一组寄存器,它们只用于保存过程活动记录中的参数。
                    每当函数调用时,空的活动记录依然压入到堆栈中。当函数调用链非常深而寄存器窗口不够用时,寄存器的内容就会被保存
          到堆栈中保留的活动记录空间中,以便重新利用这些寄存器

     UNIX当进程需要更多空间时,堆栈会自动生长。当试图访问当前系统分配给堆栈的空间以外时,它将产生一个硬件中断,称为页错误

     DOS在建立可执行文件时,堆栈的大小必须同时确定,而且它不能在运行时增长。在80x86中,段的最大限制是64K字节
0 0