C++11 에서 value category(값 클래스)및 move semantics(이동 의미)에 대한 소개

머리말
C++11 이전에 value categories 는 두 가지 종류 만 있 었 고 lvalue 와 rvalue 는 C++11 이후 에 새로운 value categories,즉 prvalue,glvalue,xvalue 가 나 타 났 다.value categories 를 이해 하지 못 하면 구 덩이 를 만 났 을 때 어떻게 수정 해 야 할 지 모 르 기 때문에 value categories 를 이해 하 는 것 은 C++를 쓰 는 사람 에 게 중요 하 다.그리고 value categories 를 이해 하 는 데 는 하나의 개념 인 move semantics 가 없어 서 는 안 된다.C++11 을 아 는 사람 은 std::move,오른쪽 값 인용,이동 구조/이동 복제 등 개념 을 모두 알 고 있다 고 믿 습 니 다.그러나 move semantics 라 는 개념 에 대한 정확 한 정 의 는 많은 사람들 이 모호 할 수 있 습 니 다.이 글 을 통 해 value categories 와 move semantics 에 대한 이 해 를 이야기 하고 싶 습 니 다.우선 move semantics 부터.
move semantics 가 무엇 입 니까?
semantics 는 언어학 에서 온 개념 으로 중국어 로 번역 하면'의미'이다.컴퓨터 언어 로 말하자면,아마도 많은 사람들 이 그 가 컴퓨터 과학 아래 의 하위 클래스 라 고 생각 할 것 이다.실제로 그 는 컴퓨터 과학 과 언어학 의 교차 과목 으로 언어학 적 내용 에서 나 온 개념 이 많 고 언어학 과 학생 들 이 나중에 번역 하 는 연구/일 도 있다.그래서 우 리 는 먼저 자연 언어 에 착안 하여 유사 비 를 통 해 move semantics 를 잘 이해 할 수 있다.다음은 두 문장 이 있다.
그 는 밥통 이다이것 은 밥통 입 니 다이 두 마디 말 에는 모두'밥통'이라는 단어 가 들 어 있 지만,두 문장 중'밥통'의 뜻 은 다르다.문법 적 으로 볼 때 이 두 가 지 는 모두'<대명사>는 밥통 이다'는 형식 으로 대명사 만 다 르 지만 문장의 뜻 은 완전히 다르다.문장 1 은 사람 을 욕 하 는 것 은 소 용이 없다 는 뜻 이 고,문장 2 는 이 물체 가 밥 을 담 는 통 이라는 뜻 이다.이 예 는 한 단어의 뜻(예 를 들 어 밥통)을 이해 하려 면 문장의 다른 단어 와 전체 문장 을 결합 해 야 한 다 는 것 을 설명 한다.
C++언어 에서 도 비슷 하 다.다음은 두 개의'문장'이 있다.
  • vec = vector();
  • vec = another_vec;
  • 그 중에서 vec 와 anothervec 는 모두 vector형식의 변수 입 니 다.
    이 두 문장 은 모두"vec=XXXX;"이다.의 형식 이지 만 문장 1 은 XXXX 를 변수 vec 로 이동 시 키 고 문장 2 는 XXXX 를 vec 에 복사 합 니 다.두 문장 모두'='연산 자가 있 지만 문장 1 의 뜻 은'이동'이 고 문장 2 의 뜻 은'복사'이다.그래서'='연산 자 와 전체 문장의 뜻 은 XXXX 의 유형 에 의 해 결정 된다.우 리 는 문장 1 은 이동 의 의미 가 있 고 문장 2 는 복사 의 의미 가 있다 고 말 할 수 있다.또는 문장 1 중의'='은 이동 의 의미 이 고 문장 2 중의'='은 복사 의 의미 이다.더욱 정식 적 으로 말 하면 문장 1 은 이동 의 미 를 나타 내 고 문장 2 는 복사 의 미 를 나타 내 며 문장 1 중의'='은 이동 의 미 를 나타 내 고 문장 2 중의'='은 복사 의 미 를 나타 낸다.영어 로 말 하면 statement 1 은 move semantics 를 표시 합 니 다.statement 2 displayed copy semantics; operator= in statement 1 displayed move semantics; operator= in statement 2 displayed copy semantics。
    사실'이동 의미'를 백화 로 번역 하면'이동 의 의미'다.
    5 가지 value categories(값 분류)를 어떻게 이해 합 니까?
    C++의 모든 표현 식 은 두 가지 속성 이 있 습 니 다.하 나 는 type(유형)이 고 다른 하 나 는 value category(값 분류)입 니 다.각 표현 식 의 값 분 류 는 반드시 prvalue(pure rvalue),xvalue,lvalue 세 가지 중 하나 에 속 합 니 다.prvalue 와 xvalue 는 rvalue,xvalue 와 lvalue 를 통칭 하여 glvalue(generalized lvalue)라 고 부른다.아래 그림 과 같다.
     
    그렇다면 prvalue,xvalue,lvalue 는 어떻게 정의 합 니까?
    사실 모든 표현 식 은 다음 과 같은 두 가지 속성 이 있 습 니 다.
    4.567917.idenity(동일성,또는'신분 이 있다')가 있 는 지 여부:다른 표현 식 이나 대상 과 비교 하여 같은 실체 인지 판단 할 수 있 는 지 여부.예 를 들 어 주소 가 있 으 면 그들의 주 소 를 비교 할 수 있다4.567917.이동 할 수 있 는 지 여부:할당,초기 화 등 문구 에 나타 나 면 문 구 를 이동 의 미 를 나타 내 는 지 여부그래서:
  • idenity 가 있 고 이동 할 수 있 는 표현 식 은 xvalue 표현 식 입 니 다
  • idenity 가 있 지만 이동 할 수 없 는 표현 식 은 lvalue 표현 식 입 니 다
  • idenity 가 없 지만 이동 할 수 있 는 표현 식 은 prvalue 표현 식 입 니 다
  • idenity 가 없 거나 이동 할 수 없 는 표현 식 은 실제 응용 에 서 는 이러한 표현 식 이 존재 하지 않 으 며,이러한 표현 식 이 필요 하지 않 습 니 다.
    다른 두 가지 값 유형 에 대해 우 리 는 이렇게 요약 할 수 있다.
  • idenity 표현 식 이 있 고 값 유형 은 glvalue 입 니 다
  • 이동 할 수 있 는 표현 식 입 니 다.값 분 류 는 rvalue 입 니 다
  • C++표준 에서 값 분 류 를 결정 하 는 규칙 을 분석 하고 이해 합 니 다.
    C++표준 은 어떤 표현 식 에 어떤 값 분류 가 있 는 지 규정 하 는 일련의 규칙 을 제시 했다.우 리 는 위 에서 제시 한 값 분류 정 의 를 결합 하여 이 규칙 들 을 이해 할 수 있다.예 를 들 어 xvalue 표현 식 에 대해 다음 과 같은 규칙 이 있 습 니 다.
    하나의 표현 식 이 함수 호출 이나 연산 자 표현 식 을 다시 불 러 오고 반환 형식 이 오른쪽 값 참조 라면 std:move(x)와 같은 표현 식 은 xvalue 표현 식 입 니 다.
    이 규칙 에 대해 우 리 는 이렇게 이해 할 수 있다.우선,대상 을 되 돌려 주 려 면 창고 에 메모리 공간 을 미리 남 겨 두 어야 하기 때문에 이 대상 은 idenity 가 있다.둘째,반환 형식 은 오른쪽 값 참조 이기 때문에 이 표현 식 을 사용 하 는 문 구 는 이동 의 미 를 나타 내기 때문에 이동 할 수 있 습 니 다.따라서 이 표현 식 은 xvalue 표현 식 입 니 다.
    xvalue 에 이런 규칙 이 있어 요.
    대상 구성원 표현 식,즉"a.m"입 니 다.a 가 오른쪽 값 이 고 m 가 비 인용 형식의 비 정적 데이터 구성원 이 라면 이 표현 식 은 xvalue 표현 식 입 니 다.
    이 규칙 은 이렇게 이해 할 수 있다.우선,a 는 오른쪽 값,즉 이동 할 수 있다.그러면 a 대상 의 일부분 으로서 m 도 이동 할 수 있어 야 한다.둘째,방문 대상 의"."연산 자 는 실제 적 으로 주소 오프셋 을 계산 하 는 것 입 니 다.주소 가 있 으 면 idenity 가 있 을 것 입 니 다.따라서 이 표현 식 은 xvalue 표현 식 입 니 다.
    다시 예 를 들 면:
    대상 구성원 표현 식,즉"a.m"입 니 다.m 가 구성원 매 거 진 문자 나 비정 상 구성원 함수 라면 이 표현 식 은 prvalue 표현 식 입 니 다.
    매 거 부 호 는 컴 파일 한 후에 사실은 하나의 숫자 이다.구성원 함 수 는 컴 파일 후 실제로 코드 세그먼트 의 주 소 를 가리 키 며 실제로는 숫자 이기 도 합 니 다.이 두 숫자 는 모두 컴 파일 시기 에 결 정 된 숫자 이다.cpu 가 이 숫자 를 사용 할 때 이 숫자 들 은 명령 내부 에 직접 놓 거나 레지스터 에 놓 여 있 기 때문에 메모리 에 넣 지 않 기 때문에 idenity 가 없습니다.사실 다른 측면 에서 볼 때 그들 은 하나의 값 일 뿐 변수 가 아니 기 때문에 idenity 가 없 는 것 도 합 리 적 이다.따라서 이 표현 식 은 prvalue 표현 식 입 니 다.
    C++기준 은 이런 규칙 도 많이 정의 했다.모두 비슷 한 방법 으로 분석 하고 이해 할 수 있 으 며 억지로 외 울 필요 가 없다.
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기