文档章节

学点 C 语言(39): 函数 - 使用函数的代价与内联函数(inline)

涂孟超
 涂孟超
发布于 2014/09/26 15:29
字数 424
阅读 4
收藏 0

C 语言离不开函数, 使用函数也很方便, 但使用函数是有代价的;
特别是在反复调用时, 函数会因反复地压栈、出栈而浪费一些时间.

下面是测试, 用函数与不用函数的时间分别是: 8秒、4秒!

1. 测试使用函数的代价:
#include <stdio.h>
#include <time.h>

int sum(int x) {
    return x + x;
}

int main(void)
{
    int count = 1000000000;
    int i;
    int num;
    
    time_t start, stop;

    time(&start);
    for (i = 0; i < count; i++) num = sum(i); 
    time(&stop);
    printf("调函数用时: %d 秒;\n", stop - start);  /* 8 */
    
    time(&start);
    for (i = 0; i < count; i++) num = i + i;    
    time(&stop);
    printf("非函数用时: %d 秒;\n", stop - start);  /* 4 */
    
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

2. 使用内联函数:

在函数头上冠上 inline 关键字就是内联函数了.

使用内联函数可以让函数得到优化, 所谓优化就是把函数嵌入到当前位置.

一般只可以考虑把较小的函数使用内联, 因为这只是个申请, 编译器不保证对所有的申请执行内联.

内联函数只能使用在被定义(而不是被声明)的单元.

下面继续使用了上面的例子(只添加了一个 inline) 测试.

测试了几次, 基本还是上面的测试结果; 看来 C++Builder 2009 并没有理会它.
#include <stdio.h>


inline int sum(int x) {
    return x + x;
}

int main(void)
{
    int count = 1000000000;
    int i;
    int num;
    
    time_t start, stop;

    time(&start);
    for (i = 0; i < count; i++) num = sum(i); 
    time(&stop);
    printf("调函数用时: %d 秒;\n", stop - start);
    
    time(&start);
    for (i = 0; i < count; i++) num = i + i;    
    time(&stop);
    printf("非函数用时: %d 秒;\n", stop - start);
    
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/12/04/1347882.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
c语言中的的内联(inline)函数

c语言中的的内联(inline)函数 发表于 2011 年 01 月 26 日 由 admin c/c++中的inline,使用在函数声明处,表示程序员请求编译器在此函数的被调用处将此函数实现插入,而不是像普通函数那样生...

长平狐
2012/09/03
292
0
GCC and C99 inline

C语言的inline 转以前我用Docbook写的一篇关于C语言inline关键字使用的文章。唉,要是能用docbook直接写Blog就好了。用得越多发现Docbook这个东西真是越好用啊~~ 本文介绍了GCC和C99标准中...

长平狐
2012/09/03
118
0
[从C到C++] 1.8 C++ 内联函数(inline)

C++语言新增关键字 inline,用于将一个函数声明为内联函数。在程序编译时,编译器会将内联函数调用处用函数体替换,这一点类似于C语言中的宏扩展。 采用内联函数可以有效避免函数调用的开销,...

wu_being
2018/06/16
0
0
Kotlin基础之内联函数

内联函数 使用高阶函数会给运行时带来一些坏处:每个函数都是一个对象,捕获闭包(如:访问函数体内的变量),内存分配(函数对象或Class),虚拟调用引入的运行过载。 使用内联Lambda表达式...

code_xzh
2018/01/10
0
0
函数默认值,内联函数和函数的重载

函数的默认值 实参匹配形参时从左向右匹配,但是从右向左依次赋默认值。 函数默认值不能重复复制 例如:①:int fun(int a,int b,int c=30); int fun(int a,int b,int c=30) { return a+b+c...

Monster7559
2018/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

glide 下载golang.org包问题

今天编译Uber的Aresgo。依赖管理用 glide,下载golang.org 包的时候遇到问题。 方法一: 设置 glide mirror glide mirror set https://golang.org/x/mobile https://github.com/golang/mobi...

shengjuntu
16分钟前
0
0
4.线程

线程是操作系统中最小的执行单元。 它本身不是一个程序,而是在程序中运行。 换句话说,线程并不相互独立,并与其他线程共享代码段,数据段等。 这些线程也被称为轻量级进程。 线程状态 新线...

Eappo_Geng
22分钟前
0
0
在Linux上编译LLVM/Clang 8.0.0等全部源代码

本教程使用的操作系统是Ubuntu Linux 18.04.2 LTS版本,要编译的LLVM源代码是8.0.0。 1、安装必要的软件。它们是:build-essential/cmake/swig/python-swigpk/libxml2/libxml2-dev/libncurs...

ryanliue
30分钟前
3
0
毕业季,我的Linux求职之路

秋招终于告一段落了,本硕的七年求学之路也快画上了句号。回首求职的这一段日子,痛苦并快乐着。感谢所有陪伴着我走过这一段路程的同学,所有的辛酸都值得铭记。求职的过程中在网上看了很多的...

linux-tao
今天
4
0
Mybatis动态语句,if test字符串不用进行null判断

描述:根据creator列进行过滤获取image表的数据。 代码如下: @Select("<script>" + " select * from image " + " <where>" + " <if test='isAllCreator != 1'> ......

Coder顾
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部