C++ 오른쪽 참조 및 왼쪽 참조
왼쪽: 표현식이 끝난 후에도 존재하는 지구화 대상 오른쪽: 표현식이 끝난 후에 존재하지 않는 임시 대상
모든 구명 변수와 대상은 왼쪽 값이고 오른쪽 값은 구명하지 않습니다.왼쪽 값과 오른쪽 값을 구분하는 빠른 방법: 표현식에 주소를 찾을 수 있는지 없는지를 보고, 만약 할 수 있다면 왼쪽 값이고, 그렇지 않으면 오른쪽 값이다.
오른쪽은 순오른쪽과 장망값으로 나뉜다.순수 오른쪽값은 C++98의 오른쪽값 개념으로 예를 들어 인용 함수가 되돌아오는 임시 변수이다.4+6에서 발생하는 임시 변수와 같은 연산 표현식대상과 관련이 없는 글자의 양 값, 예를 들어 10,'s',true,'hello'등 주소를 찾을 수 없는 값.
망치: c++ 11에 추가된 오른쪽 값과 관련된 표현식을 인용합니다. 이런 표현식은 보통 이동할 대상 T & & 함수를 되돌려주는 값, std: move () 함수의 되돌려주는 값 등입니다.망치와 순우치를 통일적으로 우치로 간주하여 사용에 영향을 주지 않는다.
c++ 98에서 인용은 흔히 볼 수 있는데 변수에 별명을 붙이는 것이다. c++ 11에서는 오른쪽 값 인용의 개념이 증가했기 때문에 c++ 98의 인용을 모두 왼쪽 값 인용이라고 부른다.
int a = 10;
int &refA = a;
int &b = 1; // ,1 ,
c++ 11의 오른쪽 값 인용은 & & & 기호를 사용합니다. 예를 들어
int &&a = 1;
int b = 1;
int &&c = b; // ,
class A
{
public:
int a;
};
A getTemp()
{
return A();
}
A &&a = getTemp(); //getTemp() ( )
Temp ()가 되돌아오는 오른쪽 값은 표현식 문장이 끝난 후에 그 생명도 끝날 것이다. (임시 변수) 오른쪽 값을 인용하면 오른쪽 값이 다시 생겨난다. 그 생명주기는 오른쪽 값 인용 유형 변수 a의 생명과 같다. a가 살아있다면 이 오른쪽 값이 임박할 때 변수는 계속 살아남을 것이다. 사실상 임시 변수에 이름을 붙인다.
A의 형식은 오른쪽 값 인용 형식 (int & &) 입니다. 왼쪽 값과 오른쪽 값의 각도에서 구분하면 실제로는 왼쪽 값입니다.주소를 찾을 수 있고, 이름도 있기 때문에, 이름이 붙은 오른쪽 값입니다.
따라서 왼쪽 값 인용은 왼쪽 값만 귀속되고 오른쪽 값 인용은 오른쪽 값만 귀속됩니다.상수 왼쪽값 인용은 하나의 특례로 만능 인용 유형이라고 할 수 있다. 비상량 왼쪽값, 상수 왼쪽값, 오른쪽값을 귀속할 수 있다. 그리고 오른쪽값을 귀속할 때 오른쪽값 인용처럼 오른쪽값의 생명기를 연장할 수 있기 때문에 읽을 수 있을 뿐 고칠 수 없다는 단점이 있다.예는 다음과 같습니다.
const int &a = 1; // ,
class A
{
public:
int a;
};
A getTemp()
{
return A();
}
const A &a =getTemp(); // , A& a
실제로 우리는 많은 상황에서 상수 왼쪽 값을 사용하여 이 기능을 인용했다. 예는 다음과 같다.
class Copyable
{
public:
Copyable() {}
Copyable(const Copyable &o)
{
std::cout << "Copied" << std::endl;
}
};
Copyable ReturnRvalue()
{
return Copyable(); //
}
void AcceptVal(Copyable a)
{
}
void AcceptRef(const Copyable &a)
{
}
int main()
{
std::cout<
상술한 예가 운행된 후 결과는 예상과 다르다.AcceptVal (ReturnRvalue ()) 은 두 번의 복사 구조 함수를 호출해야 하며, 한 번은 ReturnRvalue () 함수에서 Copyable () 대상을 만들고, 돌아올 때 복사 구조 함수를 호출하여 임시 대상을 생성합니다.AcceptVal () 을 호출할 때, 이 대상을 함수의 국부 대상 a에 복사합니다. 모두 두 번의 복사 구조 함수를 호출했습니다.AcceptRef()의 다른 점은 형삼은 상수 왼쪽 값 인용으로 오른쪽 값을 받아들일 수 있고 복사할 필요가 없다는 것이다.
실제 결과는 어떤 방식이든 한 번의 복사 구조 함수가 호출되지 않았다는 것이다.
컴파일러가 반환값 최적화(RVO/NRVO, RVO, Return Value Optimization 반환값 최적화, NRVO, Nameed Return Valude Optimization)를 시작했기 때문이다.컴파일러는 ReturnRvalue 내부에 하나의 대상이 생성된 것을 발견했다. 되돌아온 후에 임시 대상을 생성하여 복사 구조 함수를 호출해야 하기 때문에 매우 번거롭다. 그래서 직접 하나의 대상으로 최적화하여 복사를 피한다. 이 임시 변수는 함수의 인삼에 값을 부여받았기 때문에 필요없다. 이 세 변수는 모두 하나의 변수로 대체되고 복사 구조 함수를 호출할 필요가 없다.
더 좋은 관측 결과를 위해 컴파일할 때 -fno-elide-constructors 옵션을 추가하면 결과가 예상과 같습니다.상술한 예는 상수 왼쪽 값이 오른쪽 값을 연결하고 복사를 한 번 줄일 수 있다는 것을 설명하고자 한다. (비상 양의 왼쪽 값 인용을 사용하면 실패할 수 있다. ReturnRvalue () 가 임시 대상 (오른쪽 값) 으로 되돌아오기 때문이다.
//g++ test.cpp -o test -fno-elide-constructors
요약: T는 특정 유형
(1) 왼쪽 값 참조, T&를 사용하여 왼쪽 값만 바인딩할 수 있음
(2) 오른쪽 값 참조, T&&&를 사용하여 오른쪽 값만 바인딩할 수 있음
(3) 상수 왼쪽값,contsT&를 사용하여 왼쪽값과 오른쪽값을 연결할 수 있습니다.
(4) 이름이 지정된 오른쪽 값 참조는 컴파일러가 왼쪽 값으로 간주합니다.
(5) 컴파일러는 반환값 최적화 기능이 있지만 너무 의존해서는 안 된다.
참조:https://www.jianshu.com/p/d19fc8447eaa
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
해석된 C++ 목록 초기화 구문위의 원리를 풀면 왜 std::array의 초기화는 한 층의 대괄호가 많을 때 성공할 수 있는지 이해하기 쉽다. C++는 집합된 내부 구성원이 여전히 집합일 때 한 겹 또는 여러 겹의 괄호를 줄일 수 있습니다.괄호가...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.