• 拒绝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
    ",claculate(a,b,'+'));
    	printf("%d
    ",claculate(a,b,'-'));
    	printf("%d
    ",claculate(a,b,'*'));
    	printf("%d
    ",claculate(a,b,'/'));
    	finish = clock();
    	printf( "%f seconds
    ", (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 ",claculate(a,b,0)); printf("%d ",claculate(a,b,1)); printf("%d ",claculate(a,b,2)); printf("%d ",claculate(a,b,3)); finish = clock(); printf( "%f seconds ", (double)(finish - start) / CLOCKS_PER_SEC ); }


    当switch推断语句中case的个数不多时,上面两个程序几乎相同。但假设case非常多时,使用函数指针数组要快非常多。

    类似地。在Java里面也能够使用反射来代替swith语句产生类似的效果。


  • 相关阅读:
    「实战」攻防中钓鱼上线MAC终端
    JAVA审计SQL注入
    使用Netcat实现通信和反弹Shell
    通过Mssql提权的几种姿势
    第三方提权之ServU提权
    使用LCX进行内网端口转发
    Proxifier/ProxyChains+reGeorg组合进行内网代理
    通过Mysql提权的几种姿势
    java:文件与IO
    java:常用类库api
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7093325.html
Copyright © 2020-2023  润新知