7.6 指针、引用、数组和类型转换的效率

指针和引用

指针和引用

  1. 使用指针和使用引用两者的效率是一样的,编译器生成的代码完全相同,区别仅仅在于编程风格。

指针算数运算

  1. 指针实际上是一个保存内存地址的整数,因此指针算数运算和整数运算一样快。

函数指针

  1. 如果可以预测目标地址,那么通过函数指针调用函数通常要比直接调用函数多花几个时钟周期。
  2. 如果目标地址被错误的预测,那么可能会导致长时间的延迟。

成员指针(member pointers)

  1. 没遇到过,遇到再补。

智能指针

  1. 没遇到过,遇到再补。

数组

  1. 数组是通过在内存中连续存储元素来实现的。
  2. 在C和C++中,数组中没有存储关于数组大小的信息。
  3. 如果需要更高的安全性以及存储数组大小的信息。
  4. 应该按顺序访问多维数组,保证最后一个索引变化最快。

类型转换

整数类型转换

  1. 有符号和无符号数的转换不需要任何的额外周期。
  2. 对于整数不同类型的转换(int, short int, long),有符号转换成更大类型需要补充符号位,无符号转换成更大类型需要补0。如果代码是算术表达式,这通常需要一个时钟周期。如果是从内存中的变量中读取值,则类型大小转换通常不需要额外的时间。
  3. 将整数转换成更小的类型只需要忽略较高的位,无需溢出检查,不需要额外的时间。

浮点类型转换

  1. 如果不使用SSE2或者更新的指令集(SSE2首次在奔腾4上使用),那么转换将花费50-100个时钟周期。
  2. 由1,应尽量避免浮点转换,避免在最内层循环进行转换,使用更新的指令集,或者使用四舍五入代替浮点转换中的截断。

指针类型转换

  1. 指针可以转换成另一种类型的指针,也可以和整数互相转换。
  2. 这种转换不需要花费额外的时钟周期,仅仅是解释的不同。

重新解释对象

  1. 没遇到过,遇到再补。
  2. 书上的示例代码把一个float类型的变量x的地址转换成了一个指向整数的指针,之后对该指针取值,x便可以当作整数访问(这对我来说太怪了)。

预定义的关键字

  1. const_cast 可以解除const对于指针的限制。
  2. static_cast 用于将float转换为int。
  3. reinterpret_cast 用于指针转换,并且添加了语法检查,不产生人任何额外代码。
  4. dynamic_cast 用于将指向一个类的指针转换为指向另一个类的指针。它在运行时检查转换是否有效。
  5. dynamic_cast可以用于基类和派生类的对象转换,它比简单类型转换更耗时,同时也更安全。

转换类对象

  1. 没遇到过,遇到再补。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值