拒绝switch,程序加速之函数指针数组
先看一个使用switch语句的程序:
#include <stdio.h>
#include <time.h> //加法
int add(int a,int b)
{
return a+b;
} //减法
int subtract(int a,int b)
{
return a-b;
} //乘法
int multi(int a,int b)
{
return a*b;
} //除法
int divide(int a,int b)
{
return a/b;
} int claculate(int a,int b,char oper)
{
//这里使用switch语句
switch (oper)
{
case '+':
return add(a,b);
case '-':
return subtract(a,b);
case '*':
return multi(a,b);
case '/':
return divide(a,b);
default:
return -1;
break;
}
} void main()
{
int a = 250;
int b = 5;
//统计程序执行时间
clock_t start, finish;
start = clock();
printf("%d\n",claculate(a,b,'+'));
printf("%d\n",claculate(a,b,'-'));
printf("%d\n",claculate(a,b,'*'));
printf("%d\n",claculate(a,b,'/'));
finish = clock();
printf( "%f seconds\n", (double)(finish - start) / CLOCKS_PER_SEC );
}
再看一个使用函数指针数组的程序
#include <stdio.h>
#include <time.h> //加法
int add(int a,int b)
{
return a+b;
} //减法
int subtract(int a,int b)
{
return a-b;
} //乘法
int multi(int a,int b)
{
return a*b;
} //除法
int divide(int a,int b)
{
return a/b;
} int claculate(int a,int b,int oper)
{
//事实上这里应该使用hashMap。将字符'+'映射到add函数。 //直接使用数字是为了简便 //声明指向函数指针的数组
int (*pfunc[])(int a,int b) = {add,subtract,multi,divide}; return pfunc[oper](a,b);
} void main()
{
int a = 250;
int b = 5;
//统计程序执行时间
clock_t start, finish;
start = clock();
printf("%d\n",claculate(a,b,0));
printf("%d\n",claculate(a,b,1));
printf("%d\n",claculate(a,b,2));
printf("%d\n",claculate(a,b,3));
finish = clock();
printf( "%f seconds\n", (double)(finish - start) / CLOCKS_PER_SEC );
}
当switch推断语句中case的个数不多时,上面两个程序几乎相同。但假设case非常多时,使用函数指针数组要快非常多。
拒绝switch,程序加速之函数指针数组的更多相关文章
- C 函数指针数组
名字有点绕口,其实更应该翻译为指针函数数组. 记录下对Head-First C这一节的理解,几乎每天班车上都会咪两眼,几乎每次都是看不懂,敲一敲的时候才有些明白. 通俗点讲,这功能解决的是,具有同种签 ...
- C++ code:函数指针数组
函数指针作为一种数据类型,当然可以作为数组的元素类型.例如,要实现用菜单来驱动函数调用的程序框架,则用函数指针数组来实现就比较容易维护. #include<iostream> using ...
- 转:函数指针数组的妙用(I)
转自:http://blog.sina.com.cn/s/blog_4c78b35f010008hi.html 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* ...
- C 函数指针 函数指针数组 转移表
内容来自<c和指针>,整理后方便个人理解 高级声明 cdel程序可以方便的给出声明的释义 指向函数的指针 int ( *f ) ( int n_values, float amount ) ...
- C++基础——函数指针 函数指针数组
==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...
- typedef 函数指针 数组 std::function
1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA, *PDATA; //D ...
- C#委托与C语言函数指针及函数指针数组
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
- C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
#include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...
- C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子
先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...
随机推荐
- 关于sklearn中的导包交叉验证问题
机器学习sklearn中的检查验证模块: 原版本导包: from sklearn.cross_validation import cross_val_score 导包报错: 模块继承在cross_va ...
- css中background-clip属性的作用
background-clip属性的通俗作用就是指定元素背景所在的区域,有四种取值 1.border-box border-box是默认值,表示元素的背景从border区域(包括border)以内开始 ...
- html5与css3入门知识点精炼
<meta name = "keywords" content="…………"/>(网页搜索时要输入的关键字) <meta name = &qu ...
- 域名转让(bcd.cn,tjcpda.com,jscpda.com,fjcpda.com)
因本人工作有所调整,现对所拥有的域名全部转让,有需要者请与我联系,谢谢. bcd.cn tjcpda.com jscpda.com fjcpda.com 联系方式: QQ:1181608198 Ema ...
- android黑科技系列——防自动抢红包外挂原理解析
一.前言 春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了, ...
- redis-linux
redis3.0.4 server版本 jedis-2.7.2.jar spring-data-redis-1.6.0.RELEASE.jar commons-pool2-2.3.jar spring ...
- 团体程序设计天梯赛-练习集-L1-030. 一帮一
L1-030. 一帮一 “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组.本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后, ...
- 解决vcenter 6.0 vcsa安装插件时报错的问题
在安装vCenter 6.0 vsca的时候,安装插件到第二个的时候,会报出一个windows installer的错误.需要联系软件管理员或者技术支持的一个error. 经过多次的测试,我终于找到了 ...
- 给数组增加remove函数
//给数组增加indexOf函数Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { ...
- 单调队列 && 单调栈
单调队列 && 单调栈 单调队列 维护某个滑动区间的min or max,可用于dp的优化 以维护min为例,采用STL双端队列实现 每次加入元素x前 先检查队首元素==滑动后要删除的 ...