C++로 요즘 개인 사이드 프로젝트를 진행하면서 C++ 지식을 오랜만에 머리에 열심히 복기 중입니다.
처음 신입으로 들어갔었을 때, 프로젝트 매개 변수에서는 왠만해선(?) const & 로 매개 변수를 받아 사용하는 경우가 많았습니다. ( 모든 경우에 사용하는 것은 아닙니다.)
그 이유는 밑에서 설명 하겠습니다. (다 이유가 있었..)
값 복사 방식 (Pass By Value) vs 참조 방식 (Pass By Reference)
테스트 환경
- Visual Studio 2022 Release x64
- Debug 로 사용하여도 비슷한 결과가 도출
테스트 코드
// 값 복사 방식 (Pass-by-Value)
void PassByValue(vector<int> v) {
volatile int sum = 0; // 최적화 방지
for (size_t i = 0; i < v.size(); ++i) {
sum += v[i];
}
}
// 참조 방식 (Pass-by-Reference)
void PassByReference(const vector<int>& v) {
volatile int sum = 0; // 최적화 방지
for (size_t i = 0; i < v.size(); ++i) {
sum += v[i];
}
}
int main() {
vector<int> testVector(100'000'000, 1); // 100,000,000개의 요소를 가진 벡터 생성
// 값 복사 방식 시간 측정
auto start1 = high_resolution_clock::now();
PassByValue(testVector);
auto end1 = high_resolution_clock::now();
auto duration1 = duration_cast<milliseconds>(end1 - start1);
cout << "Pass-by-Value Time: " << duration1.count() << " ms\n";
// 참조 방식 시간 측정
auto start2 = high_resolution_clock::now();
PassByReference(testVector);
auto end2 = high_resolution_clock::now();
auto duration2 = duration_cast<milliseconds>(end2 - start2);
cout << "Pass-by-Reference Time: " << duration2.count() << " ms\n";
return 0;
}
테스트 결과
Pass-by-Value Time: 107 ms
Pass-by-Reference Time: 23 ms
테스트 결과를 돌려보면, 기본적으로 매번 어느 정도 다른 수치가 발생합니다.
하지만, 기본적으로 참조 방식으로 매개변수를 받아 사용하였을 경우, 성능상 이점이 발생합니다.
이렇게 발생하는 이유는 일반적으로 객체를 값으로 전달하면서 복사 생성자가 호출되어 객체가 복사됩니다.
특히 벡터, 문자열, 맵 등과 같은 큰 객체는 복사 비용이 크게 발생하게 됩니다.
&(참조) 방식을 사용하면 복사가 일어나지 않게 됩니다.
그로인한 성능 향상이 발생하는 것입니다.
const & 를 사용하는 이유
1. 불필요한 복사 방지 (성능 향상)
- 일반적으로 객체를 값으로 전달하면 복사 생성자 호출되어 객체가 복사
- 특히 벡터, 문자열, 맵 같은 큰 객체는 복사 비용↑
- const & 를 사용하면 복사가 일어나지 않음 → 성능 향상
2. 읽기 전용 보장 (const)
- const 를 사용하면 함수 내에서 매개변수를 변경할수 없음
- 원본 데이터가 변하지 않는다는 보장이 있어 안전성 증가
3. 힙 메모리 할당 감소
- 복사를 하면 새로운 객체가 만들어지고 힙 메모리가 사용될 수 있음
- const &를 사용하면 추가적인 메모리 할당이 발생하지 않음
즉, const 로 원본 데이터가 변경될 수 없도록 보호해줍니다.
& (참조) 로는 복사가 호출되지 않게 하여 복사 비용을 줄여줍니다.
물론, 함수(매서드) 내에서 원본 데이터 수정이 필요하다면 const 를 사용하지 않는 것이 맞습니다.
주로 타 언어에서는 포인터, 참조 라는 부분이 없어 신경 쓰지 않는 경우도 있으나,
C++ 언어에서는 복사 비용에 대해 생각하여 성능 향상을 시켜야합니다.
그러다보니, 주로 C++ 언어를 복잡하고 어려운 언어라고 많이들 생각합니다.
저도 여러 언어를 사용해봤으나, C/C++이 가장 어려웠던 것 같아요.

그럼에도 불구하고 C/C++ 로 시작하여 타 언어를 익히다보니, 다른 언어를 익히는데 있어 좀 더 수월한 부분도 있었습니다.
최근에는 RIO 관련하여 관심이 생겨 개인 사이드 프로젝트 겸 공부겸 하고 있는데, 재밌네요 ㅎㅎ
(정보가 별로 없다는건 함정 ㅠ)
'C, C++' 카테고리의 다른 글
[C/C++] enable_shared_from_this (0) | 2025.02.13 |
---|---|
[C/C++] C++ 17 reduce, lcm (2) | 2025.01.21 |
[C++] istringstream, ostringstream, stringstream (0) | 2023.04.25 |
[C#] delegate (대리자) (0) | 2022.10.11 |
[C#] ThreadPool 클래스 (0) | 2022.07.04 |