用内联函数代替多个驱动器

今天写象棋AI程序时候,因为有多种算法,为了比较之间的性能差异,故在多个算法模块间切换(不同函数名,相同参数),因为代码设计问题,驱动器入口不止一个,而且在代码内部,比较麻烦,所以采用宏定义方式代替整体驱动器算法。
用C/C++宏定义
最初的想法是宏定义只是普通的名字替换,所以采用这种方式
定义代码+使用代码

#define ALPHABETA alphabtea2
score=ALPHABETA(depth,alpha,beta,is_turn_red);
(使用环境为QT5.4)

报错:
‘alphabeta2’ was not declared int this scope

然后测试使用C++宏函数

#define ALPHABETA(depth,....) alphabeta2(depth...))

注释:c++宏函数没有类型
同样的错误,没有声明alphabeta2

测试其他函数,宏定义如下函数
#define HELLO(a,b) (cout<< a << b << endl))
相应头函数都已包含,运行编译。报错,cout was not declared in this scope
推测:c++宏函数中无法调用其他函数,c++宏定义无法代替函数名

宏函数实例:
#define MAX(a,b) ((a)>(b)?(a):(b))

使用内联函数

inline int ALPHABETA(int depth,....)
{
    return alphabeta2(depth,...);
}

以上,问题解决

宏只会无脑替换,比如如下实例:
MAX(++a, ++b),如果MAX是普通函数,a和b只增加一次。但如果MAX函数式宏定义,则要展开成 ((++a)>(++b)?(++a):(++b)),a和b增加2次。所以若参数是表达式,替换函数式宏定义时一定要仔细看好。

对于内联函数:
内联函数的替换有编译器控制;
由于内联函数可以像宏一样被展开,所以调用内联函数的时候,取消了函数参数压栈、出栈所带来的开销,从而减少了函数调用开销;

即:既有函数的约束性、安全性,又有宏的高效性!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值