针对“浅谈VC++中的内联”的问题,我为您提供如下攻略。
什么是内联函数?
内联函数是在编译器编译程序的时候,程序员要求编译器将函数直接将函数中的代码插入到函数调用的位置,而不是正常的调用函数的方式。因此,内联函数的执行效率较高,但会增加程序代码的大小。在C++中,使用关键字inline
来定义内联函数。
如何在VC++中定义内联函数?
在VC++中,通常使用以下方式来定义内联函数:
// 定义内联函数
inline 返回类型 函数名(参数列表)
{
// 函数实现
// ...
return 返回值;
}
需要注意的是,当函数声明和定义分离的时候,函数也需要在声明时加上inline
关键字。
优化程序性能的原因
我们可以在一些重复调用率较高,对效率要求较高的函数前加inline关键字,这样编译器会在编译时将该函数调用直接内置在代码中,以提高程序的效率。
适合使用内联函数的场景
通常情况下,内联函数对程序的运行速度有较大的提升。如果一个函数需要经常进行调用并且代码比较简单,那么就可考虑使用inline,换言之,我们通常对程序中需要经常调用、代码量不过大的函数使用内联。
在以下两个示例中,我们将演示适合使用内联的场景。
示例1:计算两个数的平均数
// 非内联函数
double average(double a, double b)
{
return (a + b) / 2;
}
// 内联函数
inline double inline_average(double a, double b)
{
return (a + b) / 2;
}
// 测试函数性能的函数
void test(int num)
{
double x = 10.0;
double y = 20.0;
double z;
// 测试非内联函数的性能
auto t1 = clock();
for (int i = 0; i < num; i++)
{
z = average(x, y);
}
auto t2 = clock();
printf("average time: %dms\n", t2 - t1);
// 测试内联函数的性能
auto t3 = clock();
for (int i = 0; i < num; i++)
{
z = inline_average(x, y);
}
auto t4 = clock();
printf("inline_average time: %dms\n", t4 - t3);
}
// 测试函数
int main()
{
test(100000000);
return 0;
}
在进行一亿次的循环计算过程中,mm个数的统计总的如下结果:
average time: 50ms
inline_average time: 29ms
可以看出使用内联函数运行速度是比普通函数较快的。所以在需要进行简单运算的时候,可以使用内联函数进行优化。
示例2:简单计算圆的面积
// 非内联计算圆周长的函数
double circumference(double r)
{
return 2 * 3.14 * r;
}
// 内联计算圆周长的函数
inline double inline_circumference(double r)
{
return 2 * 3.14 * r;
}
// 非内联计算圆面积的函数
double area(double r)
{
return 3.14 * r * r;
}
// 内联计算圆面积的函数
inline double inline_area(double r)
{
return 3.14 * r * r;
}
// 主函数
int main()
{
double r = 10.0;
double s1, s2, z1, z2;
s1 = area(r); // 计算圆面积
s2 = inline_area(r); // 内联计算圆面积
z1 = circumference(r); // 计算圆周长
z2 = inline_circumference(r); // 内联计算圆周长
printf("s1=%f, s2=%f, z1=%f, z2=%f\n", s1, s2, z1, z2);
return 0;
}
使用内联函数后,程序执行速度更快。
总结
内联函数因其调用的快速而非常实用。但是使用内联函数也有其局限性,比如函数代码很大或者递归函数都无法使用,还有就是如果编译器自己认为函数执行的次数不够多或者无法将函数的代码片所放入内敛调用中,那么内联关键字将被忽略。不过,对于一些频繁调用、代码简单的函数,可适当使用inline提高编程效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈VC++中的内联 - Python技术站