2012-05-24 4 views
3

Следующий код преобразует std::string в boost::posix_time::ptime.Преобразование std :: string для boost :: posix_time :: ptime

После профилирования я увидел, что большая часть времени, проведенного в этой функции (около 90%), напрасно направляется на выделение памяти для time_input_facet. Я должен признать, что я не совсем понимаю следующий код, и специально, почему time_input_facet должен быть выделен в свободной памяти.

using boost::posix_time; 

const ptime StringToPtime(const string &zeitstempel, const string &formatstring) 
{ 
    stringstream ss; 
    time_input_facet* input_facet = new time_input_facet(); 
    ss.imbue(locale(ss.getloc(), input_facet)); 
    input_facet->format(formatstring.c_str()); 

    ss.str(zeitstempel); 
    ptime timestamp; 

    ss >> timestamp; 
    return timestamp; 
} 

вы видите какой-либо способ, чтобы избавиться от выделения ли?

ответ

2

Сделать input_facet статические внутри функции:

static time_input_facet *input_facet = new time_input_facet(); 

Это будет построить фаску только на первом вызове функции и повторно фасет. Я считаю, что фасет позволяет несколько последовательных вызовов одного и того же объекта.

Обновлено: вам также не нужно строить ни строковый, ни языковой стандарт. Просто делайте это один раз либо в отдельной функции, либо здесь, в статической инициализации, и используйте поток соответственно.

Updated2:

const ptime StringToPtime(const string &zeitstempel, const string &formatstring) 
{ 
    static stringstream ss; 
    static time_input_facet *input_facet = NULL; 
    if (!input_facet) 
    { 
    input_facet = new time_input_facet(1); 
    ss.imbue(locale(locale(), input_facet)); 
    } 

    input_facet->format(formatstring.c_str()); 

    ss.str(zeitstempel); 
    ptime timestamp; 

    ss >> timestamp; 
    ss.clear(); 
    return timestamp; 
} 
+0

Я не понимаю, кто называет 'delete' для' time_input_facet'? Могу ли я использовать один и тот же 'time_input_facet' для многих разных конверсий с разными строками формата? – nabulke

+0

[std :: locale] (http://en.cppreference.com/w/cpp/locale/locale/~locale) вызывает удаление для вас. –

+0

Да, input_facet никогда не разрушается (только на выходе программы). Это небольшая цена для оплаты, если она улучшает производительность на 90% путем удаления избыточных распределений. Конечно, вы можете сделать его статическим глобальным или членом класса, поэтому он будет разрушен должным образом. –

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