본문 바로가기
C++

[C++] 값 복사는 무조건 느리다는 편견과 현대적 기준

by Oz Driver 2026. 2. 15.

1. 배경 : 값 복사 비용에 대한 오해

오랫동안 C/C++ 개발 환경에서 “복사는 느리고 참조는 빠르다”는 규칙은 당연한 상식이었습니다. 이는 과거의 저성능 컴파일러와 하드웨어 제약 속에서는 유효한 지침이었으나, 현대 CPU 아키텍처와 SIMD 연산, 고도화된 최적화 컴파일러 환경에서는 이 규칙을 재검토할 필요가 있습니다.

 

2. 하드웨어 관점 : 레지스터와 역참조

Rectangle, Vector4, Color 등 16바이트 내외의 작은 구조체는 현대 CPU에게 이른바 "한 입 거리" 입니다.

값 전달 시 

CPU는 데이터를 즉시 레지스터에 적재하여 연산에 투입합니다. 메모리 복사 비용보다 레지스터 직접 연산의 이득이 더 큽니다.

참조 전달 시 

주소(8바이트)를 전달한 뒤, CPU가 메모리(RAM)를 다시 조회하는 역참조 과정이 발생합니다. 작은 데이터에서는 16바이트 복사보다 이 주소 기반 조회 비용이 더 비쌀 수 있습니다.

 

3. 설계와 최적화의 이점

작은 데이터를 값으로 다루면 다음과 같은 실무적 이점이 있습니다.

Aliasing 감소

컴파일러가 데이터 오염 가능성을 배제하고 공격적인 최적화를 수행할 수 있습니다.

안전성

지역 변수의 수명 문제(Dangling Reference)에서 자유롭고, 스레드 간 데이터 공유 시 경합 위험이 낮습니다.

직관성 

데이터의 흐름이 명확하며 코드 가독성이 향상됩니다.

 

4. 데이터 크기에 따른 선택 기준

값 전달 권장 (Value)

  •  약 64바이트 이하의 단순 구조체 

  •  Unreal Engine 의 FVector, Unity 의 Vector3 와 같은 수학 타입

  •  Rectangle, Color 같은 기하학 타입

참조 전달 권장 (const &)

  •  std::vector, std::string 등 동적 메모리 관리 객체

  •  수백 바이트 이상의 대형 구조체

  •  객체의 상태를 공유하거나 직접 수정해야 하는 경우

 

5. 결론

“참조는 빠르고 값은 느리다” 는 규칙은 더 이상 절대적이지 않습니다.

작은 구조체는 값으로, 대형 컨테이너나 복사 비용이 큰 객체는 참조로 다루는 것이 현대 하드웨어와 타협하는 가장 효율적인 선택 기준입니다.