Effective c++条款1-2总结

原创 2016年05月30日 11:06:24

开始看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常量如果在函数体内定义则作用域只限于该函数体
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Effective C++ 读书笔记 条款1~2

条款01:视C++为一个语言联邦     为了更好的理解C++,我们将C++分解为四个主要次语言: · C。说到底C++仍是以C为基础。区块,语句,预处理器,内置数据类型,数组,指针统统来自C。 ...

Effective C++(条款1-4)

1、对于单纯常量,最好以const对象或enums替换#define 2、对于形似函数的宏,最好改用inline函数替代#define 3、成员函数如果是const 意味着什么? 有两个流行的概念...

std::tr1::function 的资料--------effective C++ 条款 35相关

本文转自:http://www.cnblogs.com/qlee/archive/2011/07/04/2097594.html    感谢前辈对我的帮助 在C++的TR1中(Technol...

Effective C++ 3e----new & delete(八)条款2:写了placement new也要写placement delete

《Effective Modern C++》翻译--条款2: 理解auto自动类型推导

条款2: 理解auto自动类型推导如果你已经读过条款1关于模板类型推导的内容,那么你几乎已经知道了关于auto类型推导的全部。至于为什么auto类型推导就是模板类型推导只有一个地方感到好奇。那是什么呢...

Effective C++ 条款2

尽量以const、enum、inline替换#define首先,大家要明白一个道理。#define是什么,有什么作用。很简单,大家都知道#define实现宏定义,如下代码:#define Flag 1...

effective c++读书笔记 条款2

#ifndef Clause2_H #define Clause2_H条款2:尽量以const,enum,inline替换#define//知识点1 //#define APSECT_RATIO ...

《Effective C++》 条款0-2

前言(废话):今天开始读<>这本书。这个笔记主要是对书里的条款记录自己的理解,同时回复一些C++基础知识。条款0的C++基本概念: 1.隐式类型转换的问题 隐式转换是编译器执行的,不是程序员能控制...

Effective C++ 读书笔记——条款2:尽量以const,enum,inline替换#define

中“宁可以编译器替换预处理”算是另一种提法,不过这个应该是概括性的说法吧 主要事项注意如下: 1用const double AspectRatio=1.653;代替#define ASPECT_R...

Effective c++ 学习笔记——之条款1:视C++为一个语言联邦

今天开始学习Effective c++,保持一周两个条目的学习。 1.让自己习惯C++        前天慕名买了这本传说中很神的书,有评论说学c++的分两种人,一种人是看过Effective c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)