C++에서 Const 참조 대 일반 매개변수 전달
이 기사에서는 const 참조와 일반 매개변수 전달의 차이점에 대해 설명합니다.
const 참조를 더 잘 이해하려면 먼저 값에 의한 전달, 참조에 의한 전달 및 const 참조에 의한 전달의 차이점을 이해해야 합니다.
C++에서 값으로 전달
매개변수 값을 전달하기 전에 컴파일러는 더미 변수를 사용하여 메모리 복사본을 만들고 값을 전달합니다.
#include <bits/stdc++.h>
using namespace std;
void fun(int num) { num = num + 10; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
출력:
30
매개변수 n
이 fun()
함수를 통과하면 컴파일러는 n
에 메모리 복사본을 생성합니다. 복사본이기 때문에 n
의 원래 값은 함수에 의해 수정되지 않습니다.
여기서 우리는 두 가지 단점을 만난다. 값을 변경할 수 없으며 매개변수의 복사본이 생성되어 메모리가 낭비됩니다.
C++에서 참조로 전달
이 방법은 값으로 전달하는 방법의 단점을 제거합니다. 더미 매개변수를 만들고 값을 전달하는 대신 변수의 별칭을 전달합니다.
따라서 메모리 낭비가 없으며 변수의 별칭이 전달되기 때문에 함수에서 변수에 수행된 모든 변경 사항이 반영됩니다.
#include <bits/stdc++.h>
using namespace std;
void fun(int &num) { num = num + 10; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
여기에서 n
의 값이 영향을 받습니다.
40
C++에서 Const 참조를 사용하여 전달
이제 메모리 낭비를 원하지 않고 변수 값을 변경하지 않을 때 const 참조를 사용할 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
void fun(const int &num) { num = num + 10; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
위의 코드는 num = num +10
이 const 참조로 전달될 때 컴파일 오류를 발생시킵니다. const이므로 매개변수가 읽기 전용이 되고 num
값을 변경할 수 없습니다.
출력:
[Error] assignment of read-only reference 'num'
참조가 const 참조일 때 매개변수의 값을 변경할 수 없다고 언급했지만 미묘하지만 결정적인 차이점이 있습니다.
매개변수가 const
참조이지만 전달된 매개변수가 not const
인 경우 함수 호출 중에 매개변수 값이 변경될 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
void fun(const int &n) { const_cast<int &>(n) = 40; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
우리는 전달된 매개변수가 const가 아님을 관찰했습니다. fun
기능은 캐스트의 도움으로 값을 변경할 수 있습니다.
출력:
40
const 참조가 매개변수를 전달하는 데 사용되면 역참조에 대한 추가 비용이 포함됩니다. 최악의 참조 지역성과 컴파일러 최적화 기회가 거의 없습니다.
요약
구문 - 값으로 전달:
double fun(vector<double> my_vector); //pass by value
여기에서 기본 개체 또는 벡터는 복사 생성자를 사용하여 복사됩니다. 새 개체에는 추가 메모리가 할당되어 있으며 모든 값과 하위 개체는 별도로 복사 및 저장됩니다.
따라서 위의 함수는 벡터를 복사하고 원본 벡터 자체가 아닌 해당 벡터의 복사본을 변경합니다. 개체 또는 벡터 전달이 크면 복사 프로세스가 매우 지루해져서 스토리지 및 CPU 주기를 낭비하게 됩니다.
구문 - 참조로 전달:
double fun(vector<double> &my_vector); //pass by reference
기본 벡터는 복사되지 않고 벡터 자체의 메모리 주소가 전달되므로 함수에 의해 수행된 변경은 원래 벡터에 직접 수행됩니다.
이것은 새로운 메모리가 할당되지 않고 (값비싼) 복사 생성자가 호출되지 않기 때문에 메모리와 CPU 주기를 모두 절약
합니다.
구문 - Const 참조로 전달:
double fun(const vector<double> &my_vector); //pass by const reference
위의 구문은 참조 전용 전달과 유사하지만 기본 값을 수정할 수 없다는 차이점이 있습니다. 이것은 우리 객체의 값을 복사하지 않고 수정하지 않는 문제를 해결합니다.
여기에서 참조 기호(&
)는 벡터가 복사되어서는 안 된다고 명시하고 키워드 const는 읽기 전용인 벡터를 수정할 수 없도록 만듭니다.