2015-05-31 4 views
0

я, чтобы это как 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 (поскольку функция не может быть встроенной, в конце будет необходим дополнительный вызов функции) , Это неважно. Но мне интересно, будет ли создание/уничтожение объекта медленнее ... как будут сортироваться три решения с точки зрения производительности для создания/уничтожения объекта?
+0

Я вижу ряд 'std :: sting'. Вы имели в виду 'std :: string'? –

+0

Выделение 'TimeUnitPrivate' и вызывающих функций от него может иметь (очень минимальное) влияние на производительность. –

+0

BTW, ваше текущее решение 3 не уважает правило 3 (или 5) ... – Jarod42

ответ

1

Первые два решения идентичны с точки зрения использования памяти и производительности. Один из них - просто больше объекта-у, чем другой, чисто вопрос предпочтения.

Решение идиомы управления кулаком/пимплой займет больше памяти (по размеру указателя) и будет медленнее (дополнительное косвенное обращение с каждым вызовом, дополнительное выделение при создании). Насколько медленнее? Вам нужно будет время. Усиливает ли дополнительное использование памяти и производительность в сравнении с ускорением во время компиляции и сокращением зависимости? Чисто зависит от того, что делает ваш проект. Для некоторых приложений производительность в этом масштабе не имеет значения, так что, безусловно, стоит ускорить компиляцию. Для других приложений это будет полный отказ от запуска. Нет универсального ответа.

+0

Возможно, вы правы .... экономя несколько секунд при компиляции, возможно, лучше, чем экономить несколько наносекунд во время исполнения ... по крайней мере, в моей ситуации. – jpo38

Смежные вопросы