关闭

Effective c++条款1-2总结

标签: Effective c++总结c++
290人阅读 评论(0) 收藏 举报
分类:

开始看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
查看评论

《Effective C++》:条款28-条款29

条款28避免返回handles指向对象内部成分:指的是不能返回对象内部数据/函数的引用、指针等。 条款29为异常安全而努力是值得的:指的是要有异常处理机制,避免发生异常时造成资源泄露等问题。
  • KangRoger
  • KangRoger
  • 2015-02-19 19:47
  • 1397

《Effective C++》:条款41-条款42

条款41了解隐式接口和编译期多态 条款42了解typename的双重意义条款
  • KangRoger
  • KangRoger
  • 2015-03-10 22:13
  • 1248

Effective C++ 条款2

尽量以const、enum、inline替换#define首先,大家要明白一个道理。#define是什么,有什么作用。很简单,大家都知道#define实现宏定义,如下代码:#define Flag 10以后Flag的地方,预处理器都用10来代替,试想一下,如果你的函数中不小心定义了一个Flag,而你...
  • u011058765
  • u011058765
  • 2015-06-19 12:06
  • 502

《Effective C++》:条款44-条款45

条款44将与参数无关的代码抽离templates 条款45运用成员函数模板接受所有兼容类型
  • KangRoger
  • KangRoger
  • 2015-03-12 22:01
  • 1512

《Effective C++》资源管理:条款13-条款15

在系统中,资源是有限的,一旦用完必须归还给系统,否则可能会造成资源耗尽或其他问题。例如,动态分配的内存如果用完不释放会造成内存泄漏。 这里说的资源不仅仅是指内存,还包括其他,例如文件描述符、网络连接、数据库连接、互斥锁等。 在任何情况下都要把不使用的资源归还系统是一件非常困难的事情。尤其是考虑到异常...
  • KangRoger
  • KangRoger
  • 2015-01-14 21:46
  • 1334

Effective Modern C++ 条款23 理解std::move和std::forward

Effective Modern C++ 条款23
  • big_yellow_duck
  • big_yellow_duck
  • 2016-08-30 17:11
  • 1234

Effective C++ 条款15

在资源管理类中提供对原始资源的访问前面两节都在讨论如何管理资源,一般情况下,使用资源管理类来屏蔽原始资源,对抗内存泄露等问题,避免使用原始资源。这样我们就无法直接访问原本的原始资源。毕竟程序在有些时候是需要操纵原始资源的,许多APIs要求使用原始资源。为了能操纵原始资源,我们要怎么做? 还好,sh...
  • u011058765
  • u011058765
  • 2015-06-24 10:52
  • 670

Effective C++——条款10条,条款11和条款12(第2章)

条款10:    令operator=返回一个reference to *this Have assignment operators return a reference to *this       关于赋值,可以把...
  • yiranant
  • yiranant
  • 2015-08-29 23:35
  • 607

effective C++ 读书笔记 条款21

effective C++ 读书笔记 条款21
  • djb100316878
  • djb100316878
  • 2014-11-06 16:22
  • 894

《Effective C++》:条款38-条款39

条款38通过复合塑模树has-a 或根据某物实现出 条款39明智而审慎的使用private继承
  • KangRoger
  • KangRoger
  • 2015-03-08 21:32
  • 1162
    个人资料
    • 访问:37504次
    • 积分:868
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:2篇
    • 译文:0篇
    • 评论:8条
    博客专栏
    文章分类
    最新评论