C语言优化实例:消除多级指针的间接访问
2014-05-11 20:11
232 查看
如果一个多层次的数据结构达到两级或者两级以上,举例如下:
那么通过B类型的指针b_ptr访问A类型的array_member的某一个元素array_member[0]则需要使用b_ptr->a_ptr->array_member[0]这种多级指针的形式。如果一个函数中多次用到这个变量的话,可以采用一个临时变量保存这个多级指针:int *array_member_tmp = b_ptr->a_ptr->array_member;之后再需要用的到这个多级指针就可以用这个临时变量来访问了。
如果这个函数中除了这个多级指针以外并没有多少其他需要保留在寄存器中的变量或者值的话,那么这样修改可能并没有提升,这是因为编译器已经帮我们把b_ptr->a_ptr->array_member保存在寄存器中,之后用到这个多级指针时直接从寄存器拿就可以了,而不需要再通过多级指针来访问。
但是如果某一个被频繁调用的函数中存在多个这样的变量或者该多级指针被踢出寄存器的话,那么临时变量的方法将会达到意想不到的结果。在一个实际问题中测试竟可以达到近50%的时间性能提升,但是这个测试函数逻辑功能比较复杂,而且这种多级指针的引用有很多,所以测试结果相对来说比较理想。
struct A{ int array_member[100]; //其他数据成员 }; struct B{ struct A *a_ptr; //其他数据成员 }
那么通过B类型的指针b_ptr访问A类型的array_member的某一个元素array_member[0]则需要使用b_ptr->a_ptr->array_member[0]这种多级指针的形式。如果一个函数中多次用到这个变量的话,可以采用一个临时变量保存这个多级指针:int *array_member_tmp = b_ptr->a_ptr->array_member;之后再需要用的到这个多级指针就可以用这个临时变量来访问了。
如果这个函数中除了这个多级指针以外并没有多少其他需要保留在寄存器中的变量或者值的话,那么这样修改可能并没有提升,这是因为编译器已经帮我们把b_ptr->a_ptr->array_member保存在寄存器中,之后用到这个多级指针时直接从寄存器拿就可以了,而不需要再通过多级指针来访问。
但是如果某一个被频繁调用的函数中存在多个这样的变量或者该多级指针被踢出寄存器的话,那么临时变量的方法将会达到意想不到的结果。在一个实际问题中测试竟可以达到近50%的时间性能提升,但是这个测试函数逻辑功能比较复杂,而且这种多级指针的引用有很多,所以测试结果相对来说比较理想。
相关文章推荐
- C语言优化实例:为了消除嵌套switch-case聪明的做法
- C语言 - 指针数组 多级指针 二维数组 实例讲解
- C语言优化实例:一种消除嵌套switch-case的巧妙做法
- 实例分析用指针访问二维数组的几种方法
- [转] C语言多维数组与多级指针
- 20161222C语言项目02_Reader指针错误使用实例
- 讲解C语言编程中指针赋值的入门实例
- C语言之多级指针
- C语言速度优化之指针赋值与if判断
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
- C语言使用指针访问数组
- c语言中关于二维数组的指针访问
- C语言中的多级指针
- 实例分析用指针访问二维数组的几种方法
- 【C语言提高08】【指针铁律】铁律2:间接赋值(*p)是指针存在的最大意义
- 字符指针输出值的时候不用间接访问运算符就能输出字符串的原因(整理)
- C语言--多级指针和指针类型强制转换
- C语言数组和指针是如何访问的
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
- c语言中关于一维数组的指针访问