码迷,mamicode.com
首页 > 其他好文 > 详细

inline函数与宏定义

时间:2015-11-18 19:36:25      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4975474.html

 


 

今天我在优化公司项目代码的过程中,借助了Intel的VTune工具查看热点函数,发现有一个名为GetMatrixKey的函数调用频率很高,这个函数的主要作用是从一个矩阵数组中获取Matrix,其中还包含了指针检查与数组越界检查。考虑到这个函数的功能很简单,我就把它的实现挪到了头文件,并加上了inline关键字。随后我查看了一下这个函数的调用,发现它只在下面这个函数中被引用了(其中XXXX是类的名字,可以忽略掉):

// Author : 大便一箩筐 http://www.cnblogs.com/dbylk
D3DXMATRIX* XXXX::GetTransform(int nFrame) {
    return GetMatrixKey(m_pTransform, m_nTransforms, nFrame);
}

我一看这个函数,马上就如法炮制,也把它挪进头文件,并加上了inline声明。

在继续进行了一些其他的优化后,大便一箩筐我又运行了一下VTune,想要查看优化的结果。然后我惊奇地发现只有GetMatrixKey函数被内联了,GetTransform函数并没有被内联(VTune可以跟踪函数调用,如果函数被内联,则不会出现在函数的CPU利用列表中)。我记得当初学C++时,书上只是很笼统地说内联函数必须结构简单,但又没有定义什么才算“简单”函数。

 

随后,我去查了一下C++函数要满足什么条件才会被编译器内联,各个论坛中的人众说纷纭,下面是我整理粗略整理后得到的结果:

  • 函数体非常简单,通常为1~5行代码(这个应该不准确,因为我最开始被内联的那个函数就超过5行了,况且代码行数并不能和代码复杂度划等号)
  • 函数中不能包含循环语句、switch语句或异常处理语句(还有人说不能包含if语句,但经本人测试,包含if语句的函数是可以被内联的)
  • 函数中不能调用递归函数

 

然而,这些规则并不能解释GetTransform函数为什么没有被内联。随后,我又把GetMatrixKey函数取消内联,又进行了一次测试,结果发现GetTransform函数这一次被内联了,这说明内联函数A中可以调用其他函数B,但函数B不能是内联函数。

为此,大便一箩筐我采用了宏定义的方式实现GetTransform函数:

// Author : 大便一箩筐 http://www.cnblogs.com/dbylk
#define GetTransform(Key, nFrame) GetMatrixKey((Key).m_pTransform, (Key).m_nTransforms, nFrame)

 

问题解决~

inline函数与宏定义

标签:

原文地址:http://www.cnblogs.com/dbylk/p/4975474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!