交换实施:效率&适用范围?

时间:2015-03-28 01:49:37

标签: c++ function implementation effective-c++

我正在尝试涵盖所有swap函数实现。

swap函数的以下实现中,不需要临时变量来交换两个参数的值:

void swapNoTemp1(int &a, int &b){
    a = a + b;
    b = a - b;
    a = a - b; 
}

template <class T>
void swapNoTemp2(T& i, T& j){
    i -= j;
    j += i;  
    i = (j - i);  
}

void swapNoTemp3(int &a, int &b){
    a ^= b;
    b ^= a;
    a ^= b;
}
因此,就使用的记忆而言,它比以下更有效:

void swap(int &a, int &b){
    int temp = a;
    a = b;
    b = temp; 
}

另一方面,swap可以使用以下方式实现:

void swapPointers(int *i, int *j) {
    int t = *i;
    *i = *j;
    *j = t;
}

我试图比较所有现有的实现并理解它们的适用范围。

1 个答案:

答案 0 :(得分:3)

第一个函数的行为未定义。算术可能会导致溢出,在某些机器上,溢出会导致异常。

标准规定:

  

如果在评估表达式期间,结果未在数学上定义或不在范围内   其类型的可表示值,行为未定义。 [注意:大多数现有的C ++实现   忽略整数溢出。 ......]

虽然在实践中你很有可能该功能会起作用,但最好还是避免使用它。