一、常量与宏回顾
c++中的const常量可以替代宏常数的定义
二、内联函数
C++在推荐使用内联函数替代宏代码片段
C++中使用inline关键字声明内联函数
inline 对编译器的一种请求。
inline int func(int a,int b)
{
return a<b?a:b;
}
示例代码:
#include <stdio.h>
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
inline int func(int a, int b)
{
return a < b ? a : b;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 3;
int c = FUNC(++a, b);
// c = ((++a) < (b) ? (++a) : (b));
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
输出结果:
a = 3
b = 3
c = 3
C++编译器可以将一个函数进行内联编译
被C++编译器内联编译的函数叫做内联函数
C++编译器直接将函数体插入函数调用的地方
内联函数内有普通函数调用时的额外开销(压栈,跳转,返回)
内联函数具有普通函数的特征(参数检查,返回类型等)
函数的内联请求可能被编译器拒绝
函数被内联编译后,函数体直接扩展到调用的地方
现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译
C++提供了扩展语法,能够对函数进行强制内联。
例:
#include <stdio.h>
//__forceinline
//__attribute__((always_inline))
inline
int add_inline(int n);
int main(int argc, char *argv[])
{
int r = add_inline(10);
printf(" r = %d\n", r);
return 0;
}
inline int add_inline(int n)
{
int ret = 0;
for(int i=0; i<n; i++)
{
ret += i;
}
return ret;
}
输出结果:
ret = 45;