文章目录
1. 变量存储方式
栈内存
函数返回地址,函数参数,函数内部声明的变量或对象,存储在栈中。如果这些数据中没有大的数组,栈内存是在Level-1缓存中的。
全局静态存储
存放在静态内存中,全局变量,静态变量,字符串常量,浮点常量,数组初始化变量,数组初始化列表,switch语句的跳转列表,多态中的虚表。
优点:可以在函数调用之前初始化,
缺点:在程序运行期间会一直存在。
寄存器存储
在CPU中的一小片存储区域。存放最常用的变量。
Volatile /ˈvɑːlətl/ 挥发性变量
当其他线程改变了这个值时,当前线程的临时变量会失效,重新读取最新值。
线程局部变量
在多线程中,线程中用到的变量会有自己的一个副本。
动态内存申请
通过new和delete或者malloc和free申请动态内存。动态内存存放在堆中,由于对象的创建大小不一,堆内存很容易变得碎片化。所以对堆中的内存会定时清理和重整理,还要寻找空白内存,都非常耗时。堆内存要手动释放,否则会造成内存泄漏leak
类内部声明的变量
按在类中声明的顺序顺序存储。
2 整数变量和操作
有符号和无符号整数
常量整除时,无符号整数快;
有符号的转换成浮点数更快;
溢出时:无符号整数会变成一个小的正数,有符号正数溢出时无定义的Error。
转换
有符号和无符号的之间是直接转换的,无额外操作消耗,只是CPU对同一块内存区域的态度改变了。
整数操作
简单操作
包括加减、比较、位运算、移位运算只消耗一个时钟周期,但乘法耗费34CC和除法耗费4080CC。
自增自减操作
如果前自增和后自增(i++)的结果没被当前语句用到,他们效果一样。但如果被用到。比如 x=array[i++]; 比x=array[++i];快2CC,因为后一个数组寻址时,要等待i的计算结果。
但是如果a=++b;比a=b++要快,因为前者a和b可以指向同一个区域,而后者默认结果是不同的。
3布尔
布尔运算
A && B
:如果A为false,B就被短路(不会被执行)
A || B
:如果A为true,B就被短路,
由于短路的特点,可以调整AB的先后顺序,以实现加速:
- 因此 && 运算时,是true的概率小的应该放在左边,这样右边不太可能经常执行到,以加速。
- 运算快的表达式应该放在左边
- 左边的表达式也可以作为右边是否执行的判断分支。
4指针与引用
指针和引用在内部实现上是一样的,但:
指针的优点:
①指针表达的意思更加清晰,就是一个指针。
②指针比引用的工能更加强大,
引用:语法简单,更加安全。
指针的算术运算 等价于先做一次乘法,再做一次加法:
int *p=…; p=p+12;
等价于 12*sizeof(*p)+p;
智能指针
智能指针是一个像指针一样的对象。
当智能指针被删除的时候,它指向的对象内存会被释放。
auto_ptr
: 指向被new的对象,通过赋值语句可以把一个auto_ptr的对象传给另一个。
shared_ptr
: 允许多个指针指向相同的对象。
5 类型转换
int a , float f;
f = a; // 隐式转换
f = (float) a; C-风格类型转换
f = float(a) //构造器风格类型转换
f = static_cast<float>(a) // C++ cast操作