不同数据结构的效率

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操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值