C++ 中的 const
常量可以替代宏常数定义,如:
const int A = 3; <=> #define A 3
问题:C++ 中是否有解决方案替代宏代码片段?
C++ 中推荐使用内联函数替代宏代码片段
C++ 中使用 inline
关键字声明内联函数
内联函数声明时 inline
关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
inline int func(int a,int b)
{
return a < b ? a : b;
}
C++ 编译器可以将一个函数进行内联编译
被 C++ 编译器内联编译的函数叫做内联函数
C++ 编译器直接将函数体插入函数调用的地方
内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)
C++ 编译器不一定满足函数的内联请求
内联函数示例1
Demo
#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 a1 = 1, a2 = 1;
int b1 = 3, b2 = 3;
int c1 = FUNC(++a1, b1); //<=>int c = ((++a) < (b) ? (++a) : (b))
int c2 = func(++a2, b2);
printf("a1 = %d\n", a1); //3
printf("b1 = %d\n", b1); //3
printf("c1 = %d\n", c1); //3
printf("a2 = %d\n", a2); //2
printf("b2 = %d\n", b2); //3
printf("c2 = %d\n", c2); //2
return 0;
}
内联函数具有普通函数的特征(参数检查,返回类型等)
函数的内联请求可能被编译器拒绝
函数被内联编译后,函数体直接扩展到调用的地方
宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用
现代 C++ 编译器能够进行编译优化,一些函数即使没有 inline
声明,也可能被内联编译
一些现代 C++ 编译器提供了扩展语法,能够对函数进行强制内联,如:
//g++
__attribute__((always_inline))属性
//MSVC
__forceinline
内联函数示例2
Demo
#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;
}
inline
内联编译的限制
原文:https://www.cnblogs.com/bky-hbq/p/13696845.html