본문 바로가기
C++ 공부

constructor 04

by Dev_Hugh 2021. 8. 20.
728x90
반응형

Study C++ about copy constructor & temporary object

constructor(03)강의 temporary object 꼭 보기

변수 상수

  • 자료에는 변수 / 상수 (Or Instance) 가 있다
  • 무슨 소리냐 팬의 재료를 모아놨다고 그게 팬은 아니다 적절하게 팬의 형태를 이루면서 그 기능이 실현되어야 팬이라고 할 수 있는 것과 비슷

a = 3 + 4 를 통한 예시

  • Constructor Story(3)에서 사용한 예시를 들고와서 설명해보자
  • l-value 에는 변수가 r-value에는 변수, 상수가 온다 즉 모든 l-value는 r-value가 될 수 있다
  • 그렇다면 임시결과 7은 변수일까 상수일가? 상수다!!
  • Instance 7의 life cycle은 어떨까?
  • 3 + 4를 할때 생기고 a에 대입하고 a가 7이되면 사라진다
  • 7이 상수면 r-value 라는거다 매우 중요한 개념!

a = b + 3 + c + 4 로 확장한 예시

  • 계산순서는 1.b+3 / 2. (b+3)+c / 3. ((b+3)+c)+4 이렇게 되며 각 순서 과정에서 생긴 임시객체를 T1 T2 T3라 해보자
  • 그러면 각 임시객체들의 life cycle은 어떨까?
  • T1은 T2가 생기고 소멸 T2는 T3가 생기고 소멸 T3는 a가 T3가 되면 소멸되면 메모리 효율이 좋다만 만약 이전 임시객체가 필요하다면?
  • 예를들어 임시객체 T2가 다음 코드에서 필요하면 a = (b+3)+c; 이렇게 끊고 z = a + 4; 이런식으로 나눠서 작성한다.
  • 이런 overhead가 발생해 생긴게 r-value 참조다
  • 즉 int &로 참조하면 r-value 참조는 int && 이렇게 참조

r-value 참조 쉽게 설명

  • 위 확장 예시에서 z=(b+3)+c; 이렇게 하여 임시 객체 T2를 z에 담아 썼는데 차라리 T2에 z를 넣어 임시객체 하나를 줄이면 어떨까?
  • 무슨소리냐 T2에 (b+3)+c 담아서 z에 대입보단 그냥 z에 담아버리는게 객체 입장에선 더 효율적이다 이래서 r-value 참조가 나온거다.

r-value 예제

void testFunc(int& value) 
{
    std::cout << "testFunc(int&)" << endl;
}
void testFunc(int&& value) // r-value ref
{
    std::cout << "testFunc(int&&)" << endl;
}
int main()
{
    testFunc(3 + 4);
    return 0;
}
  • 실행시 "testFunc(int&&)" 출력

여담

  • 이 부분을 공부하면서 내가 C++을 배우고 코드작성시 현재를 생각하면서 코드를 작성했다는걸 느꼈다. 단순 class를 코드 분할이 아닌 객체로 사용하는 방법에 대해 깊게 생각하게 됐다.
  • 특히 상속을 하면서 시간의 흐름에 대해 코드를 생각할 필요성이 생김
728x90
반응형

'C++ 공부' 카테고리의 다른 글

operator 01  (0) 2021.08.20
constructor 05  (0) 2021.08.20
constructor 03  (0) 2021.08.20
constructor 02  (0) 2021.08.20
constructor 01  (0) 2021.08.20