从C到C++

一、 bool类型

   bool取值false和true,是0和1的区别; false可以代表0,但true有很多种,并非只有1。

二、 const限定符

  1. 常量在定义后就不能修改,所以定义时必须初始化。
  2. 在一个文件全局作用域中定义非const变量,在另外的文件中做extern声明,就可以使用这个变量。但是,对于一个文件全局作用域中定义的const变量,在另外的文件中做extern声明,是不能被访问的:
                      //文件一

const int counter=func();

//文件二

extern const int counter;

++counter; //这里变量声明后不可以用

这里const变量要想能够被其他的文件访问,必须显示的指定它为extern:

//文件一

                     extern const int counter=func();
                     //文件二
                     extern const int counter;
                     ++counter; //这里变量声明后可以用

 3. const  int  *p ;  // *p为常量,经由*p不能更改指针所指向的内容。

int *  const  p;  // p为常量,不能更改p指向,可以更改p所指向的内容。

4. const 与 #define区别

    1) const定义的常量有类型,而#define定义的常量没有类型,编译可对前者做类型安全检查,而后者仅仅是做简单替换。

        2) const定义的常量在编译时分配内存,而#define定义的常量在预编译时进行替换,不分配内存,程序加载到内存时才分配内存。

        3)  作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消。

    定义常量还可以用enum。高层编译尽量用enum、const替换#define定义常量。底层编译#define有很大的灵活性。

三、 结构体内存对齐

  1. 为什么要对齐:

数据存在与对齐的内存地址中CPU读取数据的速度大大提升

2. 如何对齐:

     4) 第一个数据成员对齐至偏移值为0的地方

    5) 接下来的数据成员对齐(start)至对齐模数的整数倍。

     对齐模数 = 数据成员的大小与pragma pack(n) (对齐值gcc(4) vc(8))的较小值 注意gcc对齐数的取值是0 1 2 4

      6) 每个成员都有自己的对齐数 最总整个结构体对齐至成员最大对齐数的倍数。

  例:

                               typedef struct  test
                               {
                                                          char ch1;//start 0       size=1 end=1
                                                          double d;//mix(8:8)=8 -> start 8(对齐至8的整数倍)   size=8 end=16
                                                          char ch2;//mix(1:8)=1 -> start 16(对齐至1的整数倍)  size=1 end=17
                               }test_t;   //last 17:8x end=24 整个结构体大小为8的倍数即24

随机推荐

  1. html版本

    1.html4/4.01 (SGML) 非常通用的语言,少写闭合,大小写混合了,浏览器都会去容错,就是html怎么写都不会导致浏览器挂掉,大家都觉得这种方式是不科学的 2.XHTML(XML) 基于x ...

  2. nodejs protobuff node-protobuf c++ windows扩展安装笔记

    https://www.npmjs.com/package/node-protobuf 按照作者所说的办法在windows平台安装的办法,先到google的github下载2.6.1版本的protob ...

  3. [19/03/12-星期二] 数组_遍历(for-each)&复制&java.util.Arrays类

    一.遍历 for-each即增强for循环,是JDK1.5新增加的功能,专门用于读取数组或集合中所有的元素,即对数组进行遍历. //数组遍历 for-each public class Test_03 ...

  4. Webstorm 添加新建.vue文件功能并支持高亮vue语法和es6语法

    添加新建.vue文件功能 ①Webstorm 右上角File-Plugins 搜索vue如果没有就去下载 点击serch in repositories ②点击安装vue.js ③安装成功后点击右下角 ...

  5. mybatis学习记录二——mybatis开发dao的方法

    4.1     SqlSession使用范围 4.1.1     SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSession ...

  6. Node.js 笔记02

    一.关于命令 常用命令: dir 列出当前目录下面所有的文件 cd 目录名 进入到指定的目录,. 当前目录, .. 进入上级目录,cd . 当前目录, cd .. 上级目录 md 目录名 创建文件夹 ...

  7. Restframework中的Request

    1.介绍 该篇博客主要介绍restframework内置的Request类,它扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 如: 在APIView中封装的r ...

  8. 菜鸟笔记 -- Chapter 6.3 对象

    6.3 对象 Java是一门面向对象的程序设计语言,对象是由类抽象出来的,所有的问题都是通过对象来处理的,对象可以操作类的属性和方法解决相应的问题,所以了解对象的产生.操作和生存周期对学习Java语言 ...

  9. 一个logstash引发的连环案,关于logstash提示:Reached open files limit: 4095, set by the 'max_open_files' option or default, files yet to open: 375248

    不多说,直接上问题.版本logstash-2.4.0,启动后提示错误: !!! Please upgrade your java version, the current version '1.7.0 ...

  10. JavaScript中BOM的基础知识总结

    一.什么是BOM      BOM(Browser Object Model)即浏览器对象模型.      BOM提供了独立于内容 而与浏览器窗口进行交互的对象:      由于BOM主要用于管理窗口 ...