c语言中主要的关键字总结

register:

定义变量是寄存器保存,不写到内存上

  1. 因为在寄存器上,所以不能取地址
  2. 不能保存存放在databss段的数据
  3. 寄存器相当于内存的高速缓存,增加访问速度,但具体能够保存多少个由cpu决定,多余的将被忽略。

 

static

static修饰变量:

  1. static修饰局部变量,第一次遇到时初始化,并将数据存放在data段,所以函数栈针回退时并不会销毁,在程序结束后销毁。
  2. static修饰全局变量:与全局变量不同的是,其他文件在链接时不能找到此变量符号的地址。
  3. c++中,全局变量影响封装,使用类内定义的静态数据成员,通过作用域访问来实现,所以不与全局变量重名(一般在类内定义,类外初始化)。
  4. c++static修饰的数据成员不能再构造函数初始化,需要在定义时初始化。只有静态常整形变量能在类内初始化(static const int)。

static修饰函数:

  1. c语言中函数加static声明此函数在链接时不可被找到地址,只限本文件可见。
  2. c++中,static修饰的函数没有this指针传入,所以不能访问对象非static数据成员。

 

NULL

c语言中 #define NULL void*0,所以对于指针来说p == NULL p == 0 是一个道理。c++#define NULL 0 ,而对于函数的重载又会出现问题,所以引入了新的nullptr,使用类模板的作用于来区分不同类型的NULL

 

switchcase

  1. 注意记得break
  2. 浮点数不精确
  3. switch相比if else更高效,原因是查看反汇编发现使用寄存器保存值直接去比较然后跳转,而if else每次都需要运算表达式的值再跳转。

 

const

c语言中 const 为常变量 不能作为左值

c++const 为常量 必须初始化 符号为local externglobal

编译过程中常量名字替换成常量的初值

编译器要保证const修饰的量不能被直接或者间接修改掉(试图把常量的地址赋值给普通指针)

如果初始值为变量则退化成常变量

const & 引用常量(可寻址的常量和不可寻址的常量)

const右边没有任何指针的话不参与类型,引用不参与类型

 

volatile  

在多线程程序中使变量不会被缓存 保证了数据的可见性 不保证原子性

        1.防止编译器对汇编指令进行顺序上的优化

  1. 编译器对指令顺序的调优  volatile
  2. 程序运行时CPU对指令顺序的调优  barrier()

2.防止寄存器存储变量的副本值

 

structclass区别:

1.strcutclass中都可以定义变量函数实现多态继承

2.struct更偏向于定义数据类型,class偏向于定义对象和方法

3.class继承默认privatestruct继承默认public

4.class可以使用模板,struct不行

对于空structclass因为定义不同的结构体(对象)要区分,最少要分配一字节来存储他,而且要注意内存对齐。

 

大端小端的判断方法:

  1. 通过联合体判断
  2. printf判断
  3. 取地址强转后解引用

 

mallocrealloccalloc

malloc从堆申请一块内存(超过mmap阈值调用匿名映射)。

calloc 可以在分配后初始化。

realloc 扩容到新的大小,可能出现的问题:1.函数容易产生歧义,造成内存泄漏 2.realloc可能会移动位置,c++中对象引用外部资源可能造成内存泄漏。

posted @ 2018-02-16 09:38  张铁子  阅读(243)  评论(0编辑  收藏  举报