Server/C++

L Value, R Value, Reference

Juzdalua 2024. 7. 31. 18:28

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