세 가지 전달 방식의 특징
성능 비교
L-value (Left value)
int x = 10;에서 x는 L-valueR-value (Right value)
int x = 10;에서 10은 R-value, x + 5도 R-valueL-value Reference (&)
string& ref = str;R-value Reference (&&)
void func(string&& s)Move Semantics란?
- 객체의 자원(메모리 등)을 복사하지 않고 이동시키는 최적화 기법
- 불필요한 복사를 줄여 성능을 향상시킴
- R-value reference를 통해 구현됨
void StoreByValue(string s)
{
string b = s;
}
void StoreByLRef(string& s)
{
string b = s;
}
void StoreByRRef(string&& s)
{
//string b = s;
string b = std::move(s);
}
int main()
{
string a = "abc";
StoreByValue(a);
StoreByLRef(a);
StoreByRRef("abc");
return 0;
}

std::move의 역할
예제 코드: std::move 활용
class Cat
{
public:
void SetName(string name)
{
mName = std::move(name);
}
private:
string mName;
};
int main()
{
Cat kitty;
string s = "kitty";
kitty.SetName(s); // 1 copy
kitty.SetName("nabi"); // 0 copy
}
복사 횟수 분석
kitty.SetName(s) : L-value 전달 → 매개변수로 1 copy, std::move로 이동 → 총 1 copykitty.SetName("nabi") : R-value 전달 → 매개변수로 이동, std::move로 이동 → 총 0 copy
RVO란?
예제 코드: RVO 적용
string getString()
{
string s = "hello";
return s;
}
int main()
{
string a = getString();
return 0;
}
동작 방식
RVO가 개입되지 않는 경우
string getString(string s)
{
if(조건)
{
s = "hello";
}
return s;
}
NRVO (Named RVO)
- 이름이 있는 지역 변수를 반환할 때의 최적화
- 컴파일러가 보장하지 않으며, 조건에 따라 적용 여부가 달라짐
- 여러 반환 경로가 있거나 조건부 반환이 있으면 적용되지 않을 수 있음
매개변수 전달 방식 선택
1. Pass by Value
Pass by Const Reference (const T&)
Pass by Reference (T&)
Pass by R-value Reference (T&&)
Pass by Pointer (T*)
최적화 활용
std::move()를 사용하여 불필요한 복사를 줄일 수 있음코드없는 프로그래밍
C++ Reference와 Move Semantics