본문 바로가기

개발자/C++(Linux, Window)

Dynamic Array, L-value R-value

반응형

 

동적배열(Dynamic Array) 이란?

 

 동적 배열이란 크기가 고정되지 않은 배열을 의미한다. (이름 그대로 단순하다!)

보통 우리가 흔히 말하는 배열은 동적(Dynamic)의 반대인 정적(Static) 즉, 정적배열을 의미한다. 정적배열은 크기가 고정되어 있어 데이터를 크기 만큼만 저장할 수 있다.

대표적으로 C++ 의 vector 나 자바의의 ArrayList 등이 있다.



push_back  -> copy , move(C+11)

 

emplace_back -> copy 3 move  2 construct 1 순으로 빠를 것이다. construct 가 가장 빠름

 Efficient함

 

C++ 98 -> C++ 17으로 바로 migration 해라.

C++ 98 계속 쓰고 있는 기업은 이직을 해야한다.

Lvalue와 Rvalue

C++에서 모든 표현식은 Lvalue 또는 Rvalue 이다.

C++11 표준에서는 Lvalue 참조자 외에 Rvalue를 참조할 수 있는 Rvalue 참조자를 추가했다.

Rvalue 참조자는 Visual Studio 2010 이상에서 사용 가능하다.

 

https://docs.microsoft.com/ko-kr/cpp/cpp/move-constructors-and-move-assignment-operators-cpp?view=vs-2019 에 이동 생성자(Move constructor) 및 이동 대입 연산자(Move assignment operator)에 대한 사용법이 나와있다.

 

int a = 3;
a 는 메모리 상에서 존재하는 변수다. a 의 주소값을 & 연산자를 통해 알아 낼 수 있다.
보통 이렇게 주소값을 취할 수 있는 값을 Lvalue 라고 부른다.
그리고 Lvalue는 어떠한 표현식의 왼쪽 오른쪽 모두에 올 수 있다(왼쪽에만 와야 하는게 아니다).

반면에 오른쪽에 있는 '3' 을 살펴보자. '3' 은 주소값을 취할 수 있는게 아니다.
'3' 은 위 표현식을 연산할 때만 잠깐 존재하고 연산후에는 사라지는 값이다. 즉, '3' 은 실체가 없는 값입니다.
이렇게, 주소값을 취할 수 없는 값을 Rvalue 라고 부른다.
Lvalue가 식의 왼쪽 오른쪽 모두 올 수 있는 반면, Rvalue는 식의 오른쪽에만 존재해야 한다.



출처: https://link2me.tistory.com/1756 [소소한 일상 및 업무TIP 다루기]

 

L-value R-value

 

std::string a = "abc";   // 왼쪽 L-value , 오른쪽 R-value

std::string b = a;  // 왼쪽 L-value , 오른쪽 L-value

 

L-value : 나중에 다시 부를 수 있는 변수(callable) -> COPY Semantic과 관련

R-value : 한 번 쓰고 안 쓰는 변수(tmp) -> MOVE Semantic과 관련

 

class constructor

data container

 

L-value -> R-value (Efficient하기 때문)

std::move() 

아래와 같이 짜게되면 훨씬 코드가 빨라진다.

int main()
{
	std::string a = "nocope";
    std::string b = std::move(a);

}
반응형