я, чтобы это как TimeUnit
декларации в библиотеке:Какова стоимость использования шаблона данных частного класса?
Solution1:
typedef boost::posix::ptime TimeUnit;
TimeUnit createTimeUnit(int hours, int minutes);
std::string toString(const TimeUnit& timeUnit);
Скажем, я хотел бы переместить это нечто большее, объектно-ориентированный:
Решение2:
class TimeUnit : public boost::posix::ptime
{
public:
TimeUnit(int hours, int minutes);
std::string toString() const;
};
А теперь предположим, что я не хочу, чтобы библиотеки, использующие этот класс, напрямую зависели от boost, поэтому я хотел бы использовать шаблон данных частного класса, чтобы удалить любую ссылку на boost из моего заголовочного файла:
Решение3 :
class TimeUnitPrivate;
class TimeUnit
{
public:
TimeUnit(int hours, int minutes);
~TimeUnit();
std::string toString() const;
public:
TimeUnitPrivate* m_data;
};
TimeUnitPrivate
быть примерно такой же, как Solution2-х TimeUnit
и новый TimeUnit
быть просто:
TimeUnit::TimeUnit(int hours, int minutes) :
m_data(hours, minutes)
{}
TimeUnit::~TimeUnit()
{
delete m_data;
}
std::string TimeUnit::toString()
{
return m_data->toString();
}
Solution3 очень умный, и я бы с уверенностью сохранил время компиляции + лимитированное повышение.
Но мне было интересно, что была стоимость каждого решения в срок:
- Использование памяти. Будут ли три решения объектов TimeUnit нуждаться в том же количестве байтов, которые будут храниться в памяти? Если нет, то какой из них лучше (я полагаю, это решение1)
- Производительность: Конечно, решение
toString()
Solution3 будет медленнее, чем Solution2 (поскольку функция не может быть встроенной, в конце будет необходим дополнительный вызов функции) , Это неважно. Но мне интересно, будет ли создание/уничтожение объекта медленнее ... как будут сортироваться три решения с точки зрения производительности для создания/уничтожения объекта?
Я вижу ряд 'std :: sting'. Вы имели в виду 'std :: string'? –
Выделение 'TimeUnitPrivate' и вызывающих функций от него может иметь (очень минимальное) влияние на производительность. –
BTW, ваше текущее решение 3 не уважает правило 3 (или 5) ... – Jarod42