开发者社区> 幸运券发放> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C++内联函数详解

简介: C++内联函数详解 1.函数调用原理 "编译过程的最终产品是可执行程序--由一组机器语言指令组成。运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。
+关注继续查看

C++内联函数详解

1.函数调用原理

"编译过程的最终产品是可执行程序--由一组机器语言指令组成。运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。有时(如有循环和分支语句时),将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到另一个地址(函数的地址),并在函数结束时返回。下面更详细地介绍这一过程的典型实现。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入寄存器中),然后跳回到地址被保存的指令处(这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似)。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。"

2.内联函数
内联函数提供了另一种选择。编译器将使用相应的函数代码替换函数调用。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。

3.内联函数的使用
在函数声明前加上关键字inline;
在函数定义前加上关键字inline。
示例如下:

#include<iostream>
inline double square(double x){return x*x;}
int main()
{
    using namespace std;
    double a,b;
    double c = 13.0;
    a = square(5.0);
    b = square(4.5+7.5);
    cout<<"a="<<a<<",b="<<b<<endl;
    cout<<"c="<<c<<endl;
    cout<<"c squared="<<square(c++)<<endl;
    cout<<"now c="<<c<<endl;
    return 0;
}

程序输出结果如下:
a=25,b=144
c=13
c square=169
now c=14

4.内联函数与宏定义的区别
C语言使用预处理器语句#define来提供宏。如下例所示:
#define SQUARE(X) X*X
宏定义时通过文本替换开实现的--X是参数的符号标记。
a = square(5.0);->a=5.0*5.0;
b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
d = square(c++);->d=c++*c++
可以看出,对于b,需要使用括号才能正常运算。
#define SQUARE(X) ((X)*(X))
对于c,却仍递增了两次。
因此,宏定义和内联函数存在本质的区别,转换的时候应考虑是否转换后功能是否正常。

5.什么时候使用内联函数
如果执行函数代码的时间比处理函数调用机制的时间长,则节省的时间占比很小。若代码执行时间很短,则内联函数就可以节省函数调用的时间。

 

参考资料:《C++ Primer.Plus》 pp.253-255

原文地址http://www.bieryun.com/2956.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【C++要笑着学】内联函数 inline | auto关键字(C++11) | 范围for | 关键字 nullptr(二)
本章将继续讲解C++入门部分的知识,将对内联函数、改版后的auto关键字、范围for,以及指针空值nullptr 等知识点进行讲解。
0 0
【C++要笑着学】内联函数 inline | auto关键字(C++11) | 范围for | 关键字 nullptr(一)
本章将继续讲解C++入门部分的知识,将对内联函数、改版后的auto关键字、范围for,以及指针空值nullptr 等知识点进行讲解。
0 0
C++程序设计——内联函数、auto、范围for循环、nullptr
C++程序设计——内联函数、auto、范围for循环、nullptr
0 0
C++——内联函数
介绍C++的内联函数问题
0 0
【C++】C++入门 --- 命名空间 | 输入输出 | 缺省函数 | 函数重载 | 引用 | 内联函数 | auto关键字 | 基于范围的for循环 | 指针空值
命名空间 | 输入输出 | 缺省函数 | 函数重载 | 引用 | 内联函数 | auto关键字 | 基于范围的for循环 | nullptr
0 0
内联函数和引用<C++入门>(跑路人笔记2)
内联函数和引用<C++入门>(跑路人笔记)
0 0
内联函数和引用<C++入门>(跑路人笔记1)
内联函数和引用<C++入门>(跑路人笔记)
0 0
【C++初阶:入门总结】命名空间 | 缺省参数 | 函数重载 | 引用 | 内联函数
【C++初阶:入门总结】命名空间 | 缺省参数 | 函数重载 | 引用 | 内联函数
0 0
c++归来 内联函数
三级标题 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率
0 0
+关注
幸运券发放
阿里云代金码bieryun.com
文章
问答
文章排行榜
最热
最新
相关电子书
更多
C++课程-对象模型
立即下载
使用C++开发PHP7扩展
立即下载
C++对象模型
立即下载