inline函数与宏定义

本文为大便一箩筐的原创内容,转载请注明出处,谢谢: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)

问题解决~

时间: 2024-10-23 20:33:16

inline函数与宏定义的相关文章

内联函数和宏定义

内联函数的优点? 内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用. inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去, 减少了普通函数调用时的消耗. 什么时候使用inline函数? 一个函数不断被重复调用. 函数只有简单的几行,且函数内不包含for.while.switch语句. 以下情况不宜使用内联: 函数体的代码比较长. 函数体内出现循环. 类的构造函数和析构函数. 内联函数和宏的共同点是什么? 空间换时间 内联函数和宏定义的差别是什么? 宏

内联函数和宏定义的区别

内联函数和宏定义的差别是什么 版权声明:本文为博主原创文章,未经博主允许不得转载.

ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

1061: 从三个数中找出最大的数Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][Web Board] Description 定义一个带参的宏(或者模板函数),从三个数中找出最大的数. Input 3个短整型数,空格隔开 3个实数,空格隔开 3个长整数,空格隔开 Output 最大的数,对于实数保留2位小数. Sample Input 1 2 3 1.5 4.7 3.2 123456

C++内联函数、宏定义和普通函数的区别

C++内联函数.宏定义和普通函数的区别? 宏定义:在预处理阶段进行简单的文本替换,不会进行参数类型检查: 内联函数:在编译器的时候进行代码插入,编译器会在每次调用内联函数的地方直接将内联函数的内容展开,这样可以省去函数压栈和出站的开销提高效率.会进行参数                  类型检查: 普通函数:在函数调用时,跳转到函数地址执行代码: 原文地址:https://www.cnblogs.com/dingou/p/10549225.html

实验报告(函数与宏定义)

C程序设计实验报告 实验项目:函数的定义和调用 1.编写由三角形三边求面积的函数2.编写求N阶乘的函数3.求两个整数的最大公约数4.打印输出指定图形 姓名:宋梦南       实验地点: 514实验室       实验时间:2019年4月30日 一.实验目的与要求 1.编写由三角形三边求面积的函数 调用area()函数求三角形的面积 在求面积函数运用海伦公式 2.编写求N阶乘的函数 定义符号常量 使用长整型变量存放累乘积 使用全局变量存放累乘积 3.求两个整数的最大公约数 调用bcd()函数求两

第六章 实验报告(函数与宏定义)

实验项目:函数的定义和调用 模块化程序设计 实验练习1:编写由三角形三边求面积的函数 实验目的: 调用area()函数求三角形的面积 在求面积函数运用海伦公式 问题描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果. 程序框图: 程序实现: #include<math.h> #include<stdio.h> float area(float a,float b,float c) { float s,p,area; s=(a+b+c)/2; p=s*

第六章实验报告(函数与宏定义)

实验项目:函数和宏定义实验 姓名:谢丽萍    试验地点:教学楼514教室    实验地点:2019 年4月30日 一.实验目的与要求 1.掌握函数的定义方法和调用规则 2.掌握在c语言程序中主调函数和背调函数之间进行数据传递的规则 3.了解函数的返回值及其类型,并用正确使用它 4.了解局部变量和全局变量的作用域及他们与存储分类的关系,理解变量的存在性和可见性的概念 5.练习递归函数的使用 6.理解宏的概念,掌握定义无参宏和代参宏的方法了解文件包含的概念,掌握其方法 7.理解内部函数和外部函数,

第六章 函数和宏定义实验(2)

C程序设计实验报告 实验项目: 6.4.2.模块化程序设计 利用复化梯形公式计算定积分 计算Ackerman函数 6.4.3 函数的递归调用 编程计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出 编写计算学生年龄的递归函数 编写递归函数实现Ackman函数 姓名:罗龙妹 实验地点: 514实验室 实验时间:2019年5月16日 一.实验目的与要求 6.4.2.模块化程序设计 6.4.2.2 利用复化梯形公式计算定积分 掌握C语言中定义函数的方法 掌握通

第六章 实验报告(函数与宏定义)2

C程序设计实验报告 实验项目:函数和宏定义实验 姓名:罗子健 实验地点:物联网实验室 实验时间:2019年5月16日 一.实验目的与要求 (1)掌握函数定义方法和调用规则. (2)掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则. (3)了解函数的返回值及其类型,并正确使用它. (4)了解局部变量和全局变量的作用域及它们与储存分类的关系,理解变量的存在性和可变性的概念. (5)练习递归函数的使用. (6)理解宏的概念,掌握定义无参宏和带参宏的方法.了解文件包含的概念,掌握其用法. (