学点C语言(39):函数

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;
}

返回“学点C语言 - 目录”

时间: 2024-11-03 01:02:23

学点C语言(39):函数的相关文章

学点C语言(38):函数

先复习函数的定义与函数的声明: //这是一个求和函数的定义: int add(int x, int y) { return(x + y); } //可以这样声明: int add(int x, int y); //也可以这样声明: int add(int, int); 定义一个函数指针声明一个函数差不多, 用 (* ) 包括函数即可: //像这样: int (*pfun)(int, int); //或这样: int (*pfun)(int x, int y); //也可以: typedef in

学点C语言(33):函数

1. 传值参数(非指针参数): #include <stdio.h> int inc(int x); int main(void) { int num = 1; printf("%d\n",inc(num)); /* 2 */ printf("%d\n",num); /* 1; num 并没有改变,用作函数参数时只是复制过去 */ getchar(); return 0; } int inc(int x) { x++; return x; } 2. 传址

学点C语言(32):函数

C语言的函数可以返回数组以外(不包括数组指针)的任何类型. 不写明返回类型, 在以前的 C 语言版本中是默认返回 int, 现在 C99.C++ 已不支持. void 表示没有返回值, 也就无须 return 语句; 如果是其他语句必须有 return 语句. 在 main 函数中(只是 main 函数)若忘掉 return, 有些编译器会自动添加 return 0; 1. 每执行 return 语句函数将会退出: #include <stdio.h> int main(void) { pri

学点C语言(41):函数

main函数是C程序的入口点,不可或缺,不可重复; main函数应返回一个整数值给操作系统,返回0表示正常结束. 前面使用的main函数都是无参数的: int main(void); main 可以有两个参数: int main(int argc,char *argv[]); 第一个是自动获取的参数数目(+1),第二个是参数列表(字符串列表); 这一般用于控制台或 dos 下, 在 Windows 下我们双击文件名打开文件时,该文件名(包括路径)也是通过这些参数传递的. 1. 获取 main函数

学点C语言(40):函数

像 printf 这种多参函数,是借用 stdarg.h 中的宏实现的. va_list : 用于定义遍历参数列表的指针; va_start : 让指针指向第一个参数; va_arg : 获取下一个参数,并向后移动一个位置; va_end : 释放指针,完成遍历. 1. 整数求和: 本例实现了对系列整数求和,要求至少要有三个参数,并且最后一个必须是 0. 最后的 0 用于识别列表结束. #include <stdio.h> #include <stdarg.h> int sum(i

学点C语言(36):函数

数组参数属于指针参数. 指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径. 如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针. 1. 数组参数就是指向第一个元素的指针: #include <stdio.h> void getArr(int p[], int si); int main(void) { int ns[] = {1,2,3,4,5}; getArr(ns, sizeof(ns)/sizeof(ns[0])); getcha

学点C语言(35):函数

1. 递归就是: 函数自己调用自己 这是一个最简单的递归, 不过它会一直执行, 可用Ctrl+C 终止. #include <stdio.h> void prn(void) { printf("C++Builder 2009\n"); prn(); /* 自调用;注意它会一直执行,可用Ctrl+C终止执行 */ } int main(void) { prn(); getchar(); return 0; } 2. 使用递归一定要有跳出的条件: #include <st

学点C语言(34):函数

1. 局部变量: 局部变量也叫自动变量,它声明在函数开始,生存于栈,它的生命随着函数返回而结束. #include <stdio.h> int main(void) { auto int i = 9; /* 声明局部变量的关键字是auto;因可以省略,几乎没人使用 */ printf("%d\n",i); getchar(); return 0; } 2. 全局变量: 全局变量声明在函数体外,一般应在函数前; 每个函数都可以使用它,不过全局变量应尽量少用. #include

学点C语言(31):函数

1. 如果函数没有声明, 应该在调用前定义: #include <stdio.h> /* 定义求大值函数 */ int MAX(int x, int y) { if (x > y) return x; else return y; } /* 定义求小值函数 */ int MIN(int x, int y) { return x < y ? x : y; } int main(void) { int a = 5; int b = 6; /* 调用函数 */ printf("