C语言使用宏实现2个变量的交换

时间:2023-03-08 20:57:49

  记录哪个方法更普适,更高效,这些方法不包括使用函数的方法,如果使用函数的话,使用指针的方法更合适。

  •   使用中间变量

  形如 int tmp, tmp = a; a=b; b = tmp;

#define SWAP(a, b) {typeof(a) _t=a; a=b; b=_t;}

  通杀,唯一缺点是需要额外的堆栈空间。

  •   使用算术方法

#define SWAP(x, y) (x) = (x)+(y); (y) = (x)-(y);(x) = (x)-(y);

  不能使用,x+y会有可能导致数据溢出,那么就玩完了,且只能对基本数据类型操作,构造数据类型不能使用。

  •   费脑异或法

#define SWAP(x, y) (x)^=(y); (y)^=(x);(x)^=(y);

  费脑,且只能对基本数据类型操作,构造数据类型不能使用。

那么对比1,3的效率,分别使用2个宏运行如下代码:

int main(int argc, const char *argv[])
{
unsigned int k = 0xFFFFFFF; int a = ;
int b = ; while ( k-- )
{
SWAP(a, b);
}
return ;
}

使用 time ./main 计时,异或法耗时2.2-2.4s, 中间变量法耗时0.7-0.8s,效率提高了3倍。

相关文章