背景:现代计算机采用流水线工作的方式处理数据,即在取一条指令的同时执行它前面一条指令的算术运算。要做到这一点,需要在执行前一条指令的同时,知道随后需要执行的指令序列,从而使指令充满流水线。当遇到条件转移指令的时候,由于不能确定随后需要执行的指令,编译器衍生出了一种预测分支方向的功能,但是这种功能的正确率不会在所有情况下都一样高。所以需要编写程序的一方,来尽量减少这种情况的出现。
列举一个将条件数据转移的控制方式,修改成条件数据传送方式的例子:
// rearrange two vector for a[i] >= b[i] (premise a.size() == b.size())
void rearrange(vector<int>&a, vector<int>&b) {
size_t i;
for (i = 0; i < a.size(); ++ i) {
if (a[i] < b[i]) {
int temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}
}
// 修改后:
void rearrange(vector<int>&a, vector<int>&b) {
size_t i;
for (i = 0; i < a.size(); ++ i) {
int max = a[i] >= b[i] ? a[i] : b[i];
int min = a[i] >= b[i] ? b[i] : a[i];
a[i] = max;
b[i] = min;
}
}