Я бы сказал, что за сценой он будет получать указатели на a[i]
и a[j]
.
Запуск g++ -S
в следующих двух программах дает одинаковые результаты:
#include<iostream>
extern "C" void swap(int&c,int&b){
c=c+b;
b=c-b;
c=c-b;
}
int main(){
int*a=new int[1000];
a[10]=10;
a[42]=42;
swap(a[10],a[42]);
std::cout << a[10] << " " << a[42] << std::endl;
delete[] a;
return 0;
}
и
#include<iostream>
extern "C" void swap(int*c,int*b){
*c=*c+*b;
*b=*c-*b;
*c=*c-*b;
}
int main(){
int*a=new int[1000];
a[10]=10;
a[42]=42;
swap(a+10,a+42);
std::cout << a[10] << " " << a[42] << std::endl;
delete[] a;
return 0;
}
, где я использовал extern "C"
, чтобы иметь возможность diff
выходов, в противном случае искажение отличается.
Примечание, когда вы пишете, например, a+42
компилятор вычислит адрес как a+sizeof(int)*42
, учитывая, что a
является указателем на int
.Этот конкретный пример отображается как addl $168, %eax
в сгенерированном источнике сборки.