register:
定义变量是寄存器保存,不写到内存上
- 因为在寄存器上,所以不能取地址
- 不能保存存放在data和bss段的数据
- 寄存器相当于内存的高速缓存,增加访问速度,但具体能够保存多少个由cpu决定,多余的将被忽略。
static:
static修饰变量:
- static修饰局部变量,第一次遇到时初始化,并将数据存放在data段,所以函数栈针回退时并不会销毁,在程序结束后销毁。
- static修饰全局变量:与全局变量不同的是,其他文件在链接时不能找到此变量符号的地址。
- c++中,全局变量影响封装,使用类内定义的静态数据成员,通过作用域访问来实现,所以不与全局变量重名(一般在类内定义,类外初始化)。
- c++中static修饰的数据成员不能再构造函数初始化,需要在定义时初始化。只有静态常整形变量能在类内初始化(static const int)。
static修饰函数:
- c语言中函数加static声明此函数在链接时不可被找到地址,只限本文件可见。
- c++中,static修饰的函数没有this指针传入,所以不能访问对象非static数据成员。
NULL:
在c语言中 #define NULL (void*)0,所以对于指针来说p == NULL 和 p == 0 是一个道理。c++中 #define NULL 0 ,而对于函数的重载又会出现问题,所以引入了新的nullptr,使用类模板的作用于来区分不同类型的NULL。
switch和case:
- 注意记得break
- 浮点数不精确
- switch相比if else更高效,原因是查看反汇编发现使用寄存器保存值直接去比较然后跳转,而if else每次都需要运算表达式的值再跳转。
const:
c语言中 const 为常变量 不能作为左值
c++中const 为常量 必须初始化 符号为local 加 extern变global
编译过程中常量名字替换成常量的初值
编译器要保证const修饰的量不能被直接或者间接修改掉(试图把常量的地址赋值给普通指针)
如果初始值为变量则退化成常变量
const & 引用常量(可寻址的常量和不可寻址的常量)
const右边没有任何指针的话不参与类型,引用不参与类型
volatile:
在多线程程序中使变量不会被缓存 保证了数据的可见性 不保证原子性
1.防止编译器对汇编指令进行顺序上的优化
- 编译器对指令顺序的调优 volatile
- 程序运行时CPU对指令顺序的调优 barrier()
2.防止寄存器存储变量的副本值
struct和class区别:
1.strcut和class中都可以定义变量函数实现多态继承
2.struct更偏向于定义数据类型,class偏向于定义对象和方法
3.class继承默认private,struct继承默认public
4.class可以使用模板,struct不行
对于空struct和class因为定义不同的结构体(对象)要区分,最少要分配一字节来存储他,而且要注意内存对齐。
大端小端的判断方法:
- 通过联合体判断
- printf判断
- 取地址强转后解引用
malloc,realloc,calloc
malloc从堆申请一块内存(超过mmap阈值调用匿名映射)。
calloc 可以在分配后初始化。
realloc 扩容到新的大小,可能出现的问题:1.函数容易产生歧义,造成内存泄漏 2.realloc可能会移动位置,c++中对象引用外部资源可能造成内存泄漏。