Value Category
C++ 에서는 타입 뿐아니라 값에도 종류가 있습니다.
어떤 값인가? 이게 무슨 말인지 살펴보겠습니다.
위처럼 값 표현식에는 총 5개로 나눠진 값들이 있습니다.
glvalue
A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
어떤 객체, bit-field, 함수의 정체성을 결정하는 표현식이다.
prvalue
A prvalue is an expression whose evaluation initializes an object or bit-field, or computes the value of the operand of an operator, as specified by the context in which it appears.
표현식이 평가될 때, 객체나 bit-field를 초기화 하거나, 그것이 나타나는 문맥에 따라 연산자의 피연산자의 값을 계산하는 표현식이다.
xvalue
An xvalue is a glvalue that denotes an object or bit-field whose resurces can be reused (usually because it is near the end of its lifetime).
자원이 재사용될 수 있는(보통 lifetime이 끝나가는) 객체나 bit-field를 나타내는 glvalue이다.
lvalue
An lvalue is a glvalue that isn't an xvalue.
rvalue
An rvalue is a prvalue or an xvalue.
이게 무슨 말인가... text로만 봐서 이해하기는 어려워 보이네요.
사실 여기서 볼 건 glvalue, prvalue, xvalue를 중점적으로 보면 됩니다. 나머지는 자연스럽게 따라 오거든요.
먼저 glvalue를 보겠습니다.
여기서 glvalue가 identity를 결정한다는 말이 있습니다.
그럼 여기서 말하는 identity가 무엇인가?
has identity
The object can be uniquely distinguished and referred to during its lifetime.
그 객체가 자신의 수명동안 고유하게 구별되고 참조될 수 있다.
이건 C++ 표준 문서에서 identity를 따로 정의하고 있지는 않습니다. 그렇기에 이 말은 완벽한 문장은 아닙니다. 어디까지 정보입니다.
그럼 문장을 보고 알 수 있는 것이
1. 메모리 상의 고유 위치가 있어서 참조가 가능하다.
2. 그 객체가 변할 수 있고, 다른 객체와 구분이 가능하다.
3. lifetime이 존재한다.
이렇게 세 가지 입니다. 이 identity를 갖느냐 갖지 않느냐로 glvalue와 rvalue를 구분합니다.
그리고 rvalue는 move라는 특성을 갖는다고 합니다.
여기서 move는 std::move()를 의미하는 것이 아니라, type casting없이 move operation이 가능한 지에 대한 여부입니다.
그래서 가능한 객체는 rvalue에서 파생된 value 들입니다.
그렇게 분별해서, 해당 객체가 lifetime을 언제까지 갖는 지, std::move로 type casting 해야되는 value인지에 대해서 구분할 줄 알면 됩니다.
Move Semantics
Semantics : 의미론 이라는 뜻의 단어입니다. 여기서 말하는 의미론이란, 명령문, 표현식, 타입, 제어 흐름과 같은 프로그래밍 언어 구조의 의미를 말합니다.
1. std::move()
먼저 move 함수는 lvalue에서 rvalue로 타입 캐스팅하는 함수입니다. 그래서 값이 이동을 가능하게 하는 함수이지, 값을 이동하는 함수는 아닙니다.
2. forward
완벽한 이동(Perfect Forwarding)이 가능하게 하는 함수. 여기서 말하는 Perfect Forwarding은 rvalue에서 lvalue 혹은 lvalue에서 rvalue로 타입 캐스팅이 일어나는 것을 막기 때문이다.
Universal Reference에 대해서, Reference Collapsing Rules에 따라 연산자를 반환하기 때문에 받은 인자에 대해서 완벽한 이동이 가능해진다.
'( * )Engineering > 🌜C/C++' 카테고리의 다른 글
Algorithm : Sorting(1) (0) | 2025.04.28 |
---|---|
Algorithm : Algorithm Analysis (0) | 2025.04.27 |
C++ : Dependent Type / Auto (0) | 2025.04.24 |
C++ : Templates (0) | 2025.04.13 |
C++ : Standard I/O Library (0) | 2025.04.13 |