본문 바로가기
C++ 공부

constructor 03

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

Study C++ about copy constructor & temporary object

temporary object (임시 객체)

예제로 생각해보기 (이해가능하면 하기)

class
{
public:
    int TestFunc()
    {
        return nData;
    }
private:
    int nData;
}

int main(void)
{
    int nResult = TestFunc();
    return 0;
}
  • main부분을 보면 nResult = TestFunc()의 의미는 nData를 nResult에 전달하겠다는 의미다
  • Q) nData를 반환하면 TestFunc()은 사라질거고 그러면 nData도 사라질텐데 nResult에 nData를 전달하는 중간접점은 어떤식으로 동작할까?
  • A) 어셈블리를 뜯어보면 EAX 레지스터가 항상 개입한다 (항상은 아님)
  • EAX안에는 임시결과(?)라는게 들어있다
  • 따라서 TestFunc이 사라져도 Cpu안 EAX에 임시결과에 저장해서 전달해주는거

temporary object 쉽게 설명 예제

int main(void)
{
    int a;
    a = 3 + 4;
    return 0;
}
  • a = 3 + 4는 7이 a에 들어가는게 아니라 정확히는 3 + 4의 임시결과 7이 a에 대입되는거다 그렇다면 임시결과는 도대체 어디에 저장되는걸까?
  • a의 타입은 int 3, 4도 int다 즉 모두 동일형식이라는 전제로 생각하자
  • a = 3 + 4 에는 inteager instance가 몇 개 있을까?
  • 코드 수준에선 3개 이를 갖고 연산을 수행하면 4개다 임시결과 7 있지말자
  • 즉 내가 생각한거보다 더 많은게 사용되는데 이는 메모리랑 연관된다

temporary object 깊게

class CMData
{
    // 어떤 내용
}
int main(void)
{
    // 어떤 내용
    CMyData a = new CMyData();
    a = b + c; // 1번
    CMyData d = b + c; // 2번
}
  • 대충 이런 형식으로 작성되있는 예제가 있을때 a가 CMyData 클래스의 인스턴스라고 치면 CMyData의 인스턴스의 개수는 몇 개일까?
  • 임시 객체까지 포함해 4개가 된다
  • 따라서 위 질문은 "1번 구문에서 CMyData클래스의 생성자 함수가 몇 번 호출됩니까?"로 바뀌며 4번이다
  • 만약 2번의 경우를 물으면 선언과 동시에 초기화가 진행되어 3번이다
  • 이게 왜 중요하고 메모리랑 무슨 연관일까?

메모리로 보는 직관적인 이해

class MyImage
{
    // 영상 데이터 로딩하는 코드
}

int main(void)
{
    MyImage i = new MyImage();
    i = a + b; // 1번
    return 0;
}
  • 1번에서 i는 1.2MB a는 3MB, b는 2MB 정도라 치면 현재 6.2MB에 순간적으로 메모리가 피크칠땐 임시객체 5MB까지 추가로 더해진다.
728x90
반응형

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

constructor 05  (0) 2021.08.20
constructor 04  (0) 2021.08.20
constructor 02  (0) 2021.08.20
constructor 01  (0) 2021.08.20
class 03  (0) 2021.08.20