Самый эффективный способ реализовать подкачку - это распознать, что у вас есть имена и данные, связанные с именами, и что вы можете поменять их местами вместо обмена данными.
Например, компилятор может преобразоватьэто:
if (x < y) {
std::swap(x, y);
}
do_something(x, y);
return x;
.. в это:
if (x < y) {
// Names of "x" and "y" swapped in subsequent code
do_something(y, x);
return y;
} else {
do_something(x, y);
return x;
}
Конечно, поменять имена и не поменять местами данные часто бесплатно (для производительности), потому что вы на самом деле ничего не меняете,
Современные процессоры делают точно такой же трюк.
В частности;ЦП имеет регистры, а регистры - это имена, связанные с данными.Для такой инструкции, как xchg eax,ebx
(на 80x86), ЦП просто поменяет имена регистров и не будет перемещать данные.Это означает, что ЦП может выполнять обмен, когда данные в любом регистре еще не известны (например, потому что они все еще вычисляются или выбираются предыдущей инструкцией).
Другими словами;самый быстрый способ реализовать std::swap(x, y);
- убедиться, что для CPU сгенерирована правильная инструкция (например, так, чтобы CPU получил xchg eax,ebx
на 80x86, который не имеет ветвей и не должен ждать, пока значенияизвестно).