CS/C++

이동 의미론 ( move semantics)

혀니리리 2023. 12. 14. 12:15
728x90

C++11 부터 지원되는 이동연산자.

 

* lvalue : 접근할 수 있는 주소를 가진 변수 - 이동연산을 할 수 없음
(이름이 있는 변수, 함수 int a, &foo()

선행 증감 연산자 ++a, --b

lvaule배열의 인덱스 접근 l[n]

string리터럴 "hello move sementics"

등등...)

 

*prvalue: 접근을 할순 있지만 주소를 가지지 못한 표현식 -이동연산 가능

(리터럴 값 1,1.3f

후행 증감연산자 a++, b--

값 리턴함수 호출 return str1 + str2;

비 참조 캐스팅 static_cast<double>(x), (int)42

등등)

 

*xvalue : 접근할 수 있는 주소를 가지지만 이동연산을 할 수 있음

rvalue참조를 리턴하는 함수 std::move(x)

rvalue 배열의 인덱스 접근 r[n]

rvalue 참조캐스팅 static_cast<int&&>(i)

등등)

 

*rvalue = prvalue + xvalue

 

int tmain(int argc, _TCHAR* argv[])
{
    int num1 = 5, num2 = 3;
    
    num1 = 10;                  // num1은 lvalue, 10은 int형 prvalue
    num1 = num2;                // num1은 lvalue, num2은 lvalue
    int num3 = num1 + num2;     // num3은 lvalue, num1 + num2은 prvalue
    
    std::move(num3);            // rvalue 참조를 리턴 xvalue
    static_cast<DWORD>(num1)    // 값으로 캐스팅 lvalue
    static_cast<DWORD&&>(num1)  // rvalue 참조로 캐스팅 xvalue
}

예제

 

<Move Semantics>

lvalue와 rvalue를 구분한 파라미터를 받아 처리 가능

이러한 경우 move를 이용하면 캐스팅 가능.

 

 

 

-> 차후 추가 공부 필요

728x90

'CS > C++' 카테고리의 다른 글

static 변수  (0) 2024.01.05
name mangling  (0) 2023.12.14
L value 와 R value  (0) 2023.12.14
얕은복사 / 깊은복사  (0) 2023.12.14
c++ typedef vs using 키워드 차이점  (0) 2023.12.14