값의 유형 (Value Category)
값의 분류기준 :
- have identity? 값이 식별성을 갖고 있는가?
- can be moved from? 값이 메모리에서 이동할 수 있는가?
기본적인 분류단위를 Primary Category라고 하고,
두 개 이상의 복합분류를 Mixed Category라고 한다.
Primary Categories :
xvalue
lvalue
prvalue
Mixed Categories :
rvalue (xvalue + prvalue)
glvalue (xvalue + lvalue)
Have Identity? (glvalue)
값이 식별성을 갖고 있는가?
공간의 성질을 가지고 있는 값의 통칭.
데이터를 저장할 수 있는 메모리의 위치정보이다.
Can be moved from? (rvalue)
- 메모리에서 이동될 수 있는 값인가?
자료의 성질을 가지고 있는 값의 통칭.
저장될 데이터를 표현하는 비트열 리터럴이다.
- 이동이 가능한 값이란?
이동이란 어떤 공간의 데이터가 다른 공간으로 옮겨지는 작업.
이동이 완료된 후에는, 원래 자리에 데이터가 남지 않는다.
값의 성질을 가지고 있어야, 다른 공간으로 옮겨질 수 있다.
공간성 정보는 다른 공간으로 옮겨질 수 없다.
- 포인터 변수의 값은 이동가능하다.
포인터 변수의 값은 공간의 정보를, 값으로 수치화 한 것이다.
즉, 포인터 주소는 공간이 아니라 값이다.
단, 변수이름 그 자체는 공간성 정보임에 유의.
식별자를 갖고 이동 불가능한 값, lvalue
어떤 자료의 이름, 또는 그 참조형의 통칭. // L-value OR L-value Reference.
lvalue expressions :
모든 변수, 함수, 배열의 이름.
전위 증감 표현식.
문자열 리터럴.
lvalue 참조.
lvalue 참조 캐스팅.
...
이 표현식의 특징 :
대입문의 좌측에 올 수 있다.
&연산자로 값의 주소를 얻어올 수 있다.
표현식이 끝나더라도 값이 살아있다.
식별자가 없고 이동 가능한 값, prvalue
데이터 값, 또는 그 참조형의 통칭. // R-value OR R-value Reference.
prvalue expressions :
모든 리터럴 값. (문자열 리터럴 제외)
후위 증감 표현식.
...
이 표현식의 특징 :
대입문의 우측에 올 수 있다.
주소가 없다.
식별자가 있는 이동 가능한 값, xvalue
데이터성 정보가 위치성 정보를 가진 형태.
어떤 데이터든 먼저 메모리 위에 저장되어야 하는데,
prvalue가 메모리에 올라온 순간 주소를 갖게 되므로 prvalue가 아니게 된다.
컴파일러는 이러한 prvalue를 임시객체에 담은 뒤 구체화하는데.
이러한 데이터성 임시객체를 xvalue라고 한다.
이 임시객체는 데이터를 제공하기 위해 만들어졌으므로, 내용물을 이동할 수 있고.
임시객체는 주소를 갖으므로, 위치성 정보도 갖게된다.
다만, 이 임시객체는 컴파일러만 접근할 수 있기 때문에,
직접적으로는 임시객체의 주소를 구할 수 없다.
xvalue expressions :
표현식 안에서 구체화된 rvalue의 임시객체.
rvalue 참조.
rvalue 참조 캐스팅. (캐스팅 결과가 rvalue이므로 임시객체로 만든다.)
...
이 표현식의 특징 :
표현식 도중에 rvalue가 주소를 갖는 임시객체로 구체화된 형태.
컴파일러만 사용하기 때문에, &연산자가 허용되지 않는다.
표현식이 끝났을 때 사라진다.
상황에 따라 달라지는 표현식
- 맨 우측 값이 lvalue이면, 전체 표현식도 lvalue.
- 맨 우측 값이 xvalue이면, 전체 표현식도 xvalue.
- 맨 우측 값이 prvalue이면, 전체 표현식도 prvalue.
- b와 c가 lvalue이면, 전체 표현식도 lvalue.
- b와 c가 xvalue 이면, 전체 표현식도 xvalue.
- b와 c가 prvalue이면, 전체 표현식도 prvalue.
배열 첨자 연산자 ( arr[n] )
arr[n]이 lvalue이면, 전체 표현식도 lvalue. // 다차원배열에서 arr[n]은 또다른 배열의 이름이므로 lvalue.
arr[n]이 xvalue이면, 전체 표현식도 xvalue.
arr[n]이 prvalue이면, 전체 표현식도 prvalue.
( a.m )
(a -> m)
(a.*mp)
(p -> *mp)
참고문헌
'# Lang > C++' 카테고리의 다른 글
5.1 이동 의미론 (0) | 2019.04.18 |
---|---|
4.3 우측값 참조 (rvalue reference) (0) | 2019.04.16 |
4.1 표현식 (0) | 2019.04.10 |
3.2 기억영역 클래스 지정자 (0) | 2019.04.06 |
3.1 CV 제한자 (const, volatile) (0) | 2019.03.31 |