복사와 성능

킴스코딩클럽·2022년 12월 1일
1

CS기초 시리즈

목록 보기
58/71
  1. class로 instance를 찍어내는 기능
  2. 컴퓨터 그래픽스에서 template를 만들어서 instance를 여러개 찍어내는 기능
  3. 하지만 복사 붙여넣기가 되면 성능이 떨어지게 됨
  4. 프로그래머는 이걸 안좋아함

복사생성자

<클래스이름>(const 클래스이름&-rvalue도 복사하도록 const참조형을 사용)

class MyClass
{
	int mValue;
public:
	MyClass(int value):mValue {value}
	{
		std::cout << "[construct]:" << value << std::endl;
	}

	//copy constructor
	//copy constructor (복사 생성자) : 복사를 담당하는 생성자가 객체에 따로 있음
	//복사 초기화(합쳐서 쓰면 가능하게 해줌)
	//원래 안되는데 합쳐서 하면 된다는 뜻
	MyClass(const MyClass &from)
	{
		mValue = from.mValue;
		std::cout << "[copy]:" << mValue << std::endl;
	}
};

int main()
{
	//MyClass c;	기본생성자는 인스턴스가 하나 생성되면 더 안해줌
	//c = MyClass(5);


	
	MyClass c1 = MyClass(5); //첫번째와 3번째는 같은 것

	std::cout << "-----" << std::endl;

	MyClass c2(c1); 
	//두번째 생성자는 복사(실제로 인스턴스를 다른 인스턴스로 만들어내는 복사)
	//컴파일러도 민감하게 구분함
	

	std::cout << "-----" << std::endl;

	MyClass c3(MyClass(5));	//복사인 것 처럼 보이나 복사가 아님

	std::cout << "-----" << std::endl;
}
  • 복사 생성자를 프로그래머가 제공하지 않으면, 컴파일러가 기본 복사 생성자를 제공해줌
  • 얕은 복사와(swallow copy) vs 깊은 복사(deep copy)
  • 복사 생성자를 제공하지 않으면 기본 복사 생성자는 얕은 복사를 함
  • 이럴떄 복사 생성자를 생성해서 깊은 복사를 해야함 (안하면 메모리 누수, dangling pointer가 발생하기도 함)
class MyClass
{
	int mValue;
public:
	MyClass(int value):mValue {value}
	{
		std::cout << "[construct]:" << value << std::endl;
	}

	//copy constructor
	//copy constructor (복사 생성자) : 복사를 담당하는 생성자가 객체에 따로 있음
	//복사 초기화(합쳐서 쓰면 가능하게 해줌)
	//원래 안되는데 합쳐서 하면 된다는 뜻
	MyClass(const MyClass &from)
	{
		mValue = from.mValue;
		std::cout << "[copy]:" << mValue << std::endl;
	}
};




class Dog
{

};
class DogHouse
{
	Dog *owner;
};

DogHouse h1;
DogHouse h2(h1);	
//개 클래스가 개집 클래스를 2개를 쓰고 있어 문제가 생길 수 있음
//개집 클래스를 삭제할 때 개도 삭제될 수 있어 dangling pointer문제 생김
//이것이 얕은 복사(swallow copy)
//멤버 변수가 동적으로 관리하는 포인터라면 문제가 생김
//이 문제를 피하기 위해서 깊은 복사를 해야함
//개 집 클래스를 복사할 때 개까지 복사를 해야함 => 안전을 위해서
//이 것이 deep copy
//하지만 deep copy는 메모리가 더 들어감 => 그래서 기본이 아님





int main()
{
	//MyClass c;	기본생성자는 인스턴스가 하나 생성되면 더 안해줌
	//c = MyClass(5);


	
	MyClass c1 = MyClass(5); //첫번째와 3번째는 같은 것

	std::cout << "-----" << std::endl;

	MyClass c2(c1); 
	//두번째 생성자는 복사(실제로 인스턴스를 다른 인스턴스로 만들어내는 복사)
	//컴파일러도 민감하게 구분함
	

	std::cout << "-----" << std::endl;

	MyClass c3(MyClass(5));	//복사인 것 처럼 보이나 복사가 아님

	std::cout << "-----" << std::endl;

}
profile
공부 기록용

0개의 댓글