Если вы передадите ссылку на целое число в функцию подкачки, вы скопируете данные одной переменной в другую, как показано ниже:
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 1;
int b = 5;
std::cout<<"a's adress before swap: "<< &a <<'\n';
std::cout<<"b's adress before swap: "<< &b <<'\n';
swap(a, b);
std::cout<<"a's adress after swap: "<< &a <<'\n';
std::cout<<"b's adress after swap: "<< &b <<'\n';
return 0;
}
Вывод:
a's adress before swap: 0x7ffeeccaba68
b's adress before swap: 0x7ffeeccaba64
a's adress after swap: 0x7ffeeccaba68
b's adress after swap: 0x7ffeeccaba64
Таким образом, он скопировал a’s
данные в temp
, затем скопировал b’s
данные в a
, наконец скопировал temp’s
данные в b
. Это нормально, если вы передаете небольшие объекты, такие как целые числа, однако это может стоить значительного времени и пространства, если вы передаете большие объекты, такие как объекты Class, в функцию swap.
С другой стороны, если вы передадите ссылку на указатель на функцию подкачки, вы будете просто выбирать, куда указывают указатели. Например:
#include <iostream>
void swap(int *&a, int *&b){
int *temp = a;
a = b;
b = temp;
}
int main(){
int x = 1;
int y = 5;
int *a = &x;
int *b = &y;
std::cout << "where a points before swap: " << a << '\n';
std::cout << "where b points before swap: "<< b << '\n';
swap(a, b);
std::cout << "where a points after swap: " << a << '\n';
std::cout << "where b points after swap: "<< b << '\n';
return 0;
}
Обратите внимание, что в выводе, где a
и b
изменяются точки после swap
:
where a points before swap: 0x7ffee1738a68
where b points before swap: 0x7ffee1738a64
where a points after swap: 0x7ffee1738a64
where b points after swap: 0x7ffee1738a68
Во-первых, в функции свопинга temp
указывает, где a
(указывает x
), затем a
указывает, где b
(указывает y
) указывает, наконец, b
указывает, где temp
указывает (указывает x
). Таким образом, он просто поменял местами указатели и не скопировал значимых данных. Поэтому, если вам нужно поменять объекты больших данных, ссылка на указатель лучше подходит для времени и пространства.