L Value
프로그램에서 액세스 할 수 있는 주소가 있다.
Copy와 관련있다.
ex) 변수, 배열 등
R Value
프로그램에서 액세스 할 수 있는 주소가 없다.
Move와 관련있다.
ex) literal
int a = 1;
string b = "abc";
int c = 3;
int d = c;
변수 a, b, c, d는 L Value이다.
literal 1, "abc", 3은 R Value이다.
https://learn.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=msvc-170
값 범주: Lvalues 및 Rvalues(C++)
자세한 정보: Lvalues 및 Rvalues(C++)
learn.microsoft.com
Reference
std::move
1. std::move는 어떤 객체가 이동될 수 있음을 알려준다. std::move만으로 이동을 수행하지 않는다.
2. std::move는 L Value를 R Value로 바꿔주는 함수이다.
int a = 1;
int b = std::move(a);
위 코드에서 L Value a는 R Value 1로 할당되었다.
L Value b는 std::move(a)라는 R Value로 할당되었다.
해당 작업이 끝난 후, a는 아무것도 가르키지 않는다.
L Value의 참조선언자 &는 포인터와 비슷하게 사용하는 주소연산자 &와 다르다.
아래는 L Value와 R Value를 매개변수로 넘겨주고 새로운 변수에 할당하는 함수들이다.
// value 복제
void StoreByValue(int b) {
int c = b;
}
// L Value 참조
void StoreByLRef(int& b) {
int c = b;
}
// R Value 참조
void StoreByRRef(int&& b) {
int c = std::move(b);
}
int main() {
int a = 1;
StoreByValue(a);
StoreByLRef(a);
StoreByRRef(std::move(a));
}
L Value와 R Value는 개체 참조에서 자주 사용된다.
참조 및 복제
1. 변수 복제
void StoreByValue(int b) {
int c = b;
}
int main() {
int a = 1;
StoreByValue(a);
}
먼저 위 코드는 아래처럼 3번 주소에 할당이 일어난다.
int a = 1;
int b = 1; // 1 복제
int c = 1; // 1 복제
힙 메모리에 1이 2번 새로운 메모리에 복제된다.
2. L Value에서 동작하는 참조
void StoreByLRef(int& b) {
int c = b;
}
int main() {
int a = 1;
StoreByLRef(a);
}
int a = 1;
int &b = a;
int c = 1; // 1 복제
힙 메모리에 1이 1번 새로운 메모리에 복제된다.
3. R Value에서 일어나는 참조
void StoreByRRef(int&& b) {
int c = std::move(b);
}
int main() {
int a = 1;
StoreByRRef(std::move(a));
}
함수를 호출할 때 매개변수로 R Value를 넘겨주면 함수를 수행하는 쪽에서 받아드리는 매개변수를 L Value로 받아드린다.
int a = 1;
int b = move(a);
int c = move(b);
R Value를 매개변수로 넘겨 참조하면 이론상 zero copy에 해당한다.
'Server > C++' 카테고리의 다른 글
클래스 연산자 로버로딩 (0) | 2024.07.31 |
---|---|
Pass by Value, Pointer, Reference (0) | 2024.07.31 |
TLS(Thread Local Storage) (0) | 2024.07.31 |
메모리 모델과 원자적(atomic) 연산 (0) | 2024.07.31 |
CPU 파이프라인 - 명령어 파이프라인 (0) | 2024.07.30 |