Effective c++条款1-2总结

开始看Effective c++里面有一些自己不知道的特殊名词和一些应该知道的知识感觉自己不懂,通过查找资料总结了一下希望对自己和其他人有用

1、符号表

英语为symbol table, 翻译成"符号表"应该好理解一些,针对计算机语言,在不同的地方,它的用处也不一样。 符号表是用来记录编译过程中的各种信息的表格。在编译程序工作的过程中,需要不断收集、记录、查证和使用源程序中的一些语法符号(简称为符号)的类型和特征等相关信息。有词法分析时分词用的符号表。用来把所有用到的标识符区分出来。也有做语法分析时用的语法元素的符号表。编译成目标文件时,也会产生用于内/外部符号定位/链接用的符号表。生成可执行文件时也有类似的符号表。不论在什么地方,符号表的基本都可以看成一个名称索引表,为了方便数据归类查找用的。

符号表的作用:

    登记编译过程输入和输出信息
    在语义分析过程中用于语义检查和中间代码生成
    作为目标代码生成阶段地址分配的依据

#define不会讲宏放入记号表,这是为何?
symbol table是动态的。
比如你写int a = 10,那分词后会得到 int, a, =, 10, ; 这五个符号。这时,分词用的符号表里就只有这几个符号及与之对应的信息(比如类型,行号,偏移,文件之类的)。在做语法分析的时候,会直接使用分词的结果。一般就是分词用的符号表中的编号。当需要更多的符号信息的时候,就会从分词符号表时查。
而像宏之类的东西,在编译之前,会进行预处理。它所用的符号在预处理时就处理过了,所以在具体的编译时,是没有这些信息的。

实际上,预处理本身也是一次"编译"的过程。在预处理的过程中也会有它自己的"符号表"。


2、the enum hack
在条款02中提到,当编译器不允许static整数型class常量完成in class初值设定时使用的策略,理论基础是“一个属于枚举类型的数值可权充ints被使用”。
classd GamePlayer{  
  
private:  
  
         enum{ NumTurns = 5 };  
  
         intscores[NumTurns];  

         ....
  
}; 



#define和const的优缺点的总结


#define的优缺点

优点1:#define不占用内存,因为是预编译指令,编译之前都已经进行了宏替换,不需要改变值,没有内存分配的必要。
优点2:定义局部变量时,#define的作用域为定义点到整个程序结束,也可以用#undef取消定义从而限制作用域

缺点1:#define NUM 3.14 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道3.14的含义。

改善:通过const int NUM = 3.14;

缺点2: 无法利用#define创建一个class专属常量,一旦宏被定义,它就在其后的编译过程中有效(除非遇到#undef)。改善:可以通过const成员变量来满足要求。

缺点3:#define定义的常量只是进行简单的字符替换,没有类型安全检查



const 的优点


优点1:const定义的常量是有数据类型的,这样编译器可以对const常量进行数据类型安全检查
优点2:const可以做为class的成员


const成员变量缺点

1.占用存储空间
改善:通过enum代替
2.const常量如果在函数体内定义则作用域只限于该函数体
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值