#include <iostream>
#include <vector>
using namespace std;

struct Object
{
	virtual size_t usedMemory () = 0;
};

template <typename T>
struct Singleton : public Object
{
	virtual size_t usedMemory () {return sizeof(T);}
	
	static T * Get () {return instance ? instance : (instance = new T);}
	static void Destroy () {delete instance;}
	
	static T * instance;	// = nullptr;
};
template <typename T> T * Singleton<T>::instance = nullptr;

struct Simple : public Singleton<Simple>
{
	int x, y, z;
};

struct Complex : public Singleton<Complex>
{
	virtual size_t usedMemory () {return sizeof(*this) + v.size() * sizeof(int);}
	
	Complex () : v (42) {}

	vector<int> v;
};

int main() {
	// your code goes here
	cout << Simple::Get()->usedMemory() << endl;
	cout << Complex::Get()->usedMemory() << endl;

	Complex::Destroy();
	Simple::Destroy();	
	return 0;
}