C语言中定义register型变量,c语言函数register: 定义变量是寄存器保存,不写到内...

79df9c083dd107a706ea396711da66c5.png

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

因为在寄存器上,所以不能取地址

不能保存存放在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。

f1cab3eaa89a596996df8b5a8ae16b03.png

switch和case:

注意记得break

浮点数不精确

switch相比if else更高效,原因是查看反汇编发现使用寄存器保存值直接去比较然后跳转,而if else每次都需要运算表达式的值再跳转。c语言函数

const:

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

c++中const 为常量 必须初始化 符号为local 加 extern变global

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

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

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

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

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

volatile:

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

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

740bfc9743f43ab65123c324fe6ce5eb.png

编译器对指令顺序的调优 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++中对象引用外部资源可能造成内存泄漏。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-80389-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值