«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
03-29 17:28
관리 메뉴

lancelot.com

Vector를 통해 배우는 Generic Container Idioms 본문

프로그래밍

Vector를 통해 배우는 Generic Container Idioms

lancelot50 2022. 7. 25. 23:56
// default 생성자가 없다
class Point
{
	int x=0;
	int y=0;
public :
//	Point() = default;
	Point(int x, int y) : x(x), y(y) {}
};
  • Generic Container IDioms
    • Generic (template 기반) container를 설계할때, 저장되는 "타입이 가져야하는 요구조건을 최소화" 하도록 한다
    • STL container 에 저장되는 타입의 최소요구조건 : 복사생성이 가능해야한다
  • 아래 예시에서
    • new T[sz] : T 타입은 반드시 default constructor 를 가져야함
    • 메모리 할당과 호출을 분리하면 더욱 유연한 container가 된다
      • operator new() 로 메모리할당
      • placement new 를 사용해서 생성자 호출
        • C++17 : new(주소) T(argument...);
        • C++20 : std::construct_at(주소, argument...);
      • 소멸자의 명시적 호출
        • C++14 : 객체.~T();
        • C++17 : std::destroy_at(객체주소);

template<typename T>
class Vector
{
	T* buff;
	std::size_t size;
	std::size_t capacity;
public :
	Vector(std::size_t sz, const T& value) : size(sz), capacity(sz)
	{
//		buff = new T[sz];
		buff = static_cast<T*>(operator new(sizeof(T)*sz));

		int i = 0;
		try
		{
			for (i = 0; i < sz; ++i)
			{
//				new(&buff[i]) T;	// default constructor
				new(&buff[i]) T(value); // copy constructor
			}
		}
		catch (...)
		{
			for (int j = i - 1; j >= 0; --j)
				buff[j].~T();

			operator delete(buff);
			size = 0;
			capacity = 0;

			throw;
		}
	}
	~Vector()
	{
//		delete[] buff;

		for (int j = size - 1; j >= 0; --j)
			buff[j].~T();
		operator delete(buff);
	}
};

int main()
{
	Point pt(0, 0);
	Vector<Point> v(10, pt);

	return 0;
}