Показать сообщение отдельно
Старый 13.02.2015, 22:53   #2
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Велик для форматирования строк

Сообщение от mr.DIMAS Посмотреть сообщение
Это
char buffer[512];
sprintf( "%d %f %s", 12, 12.4, "ololo" );
Сильно подвержено ошибкам типа пропуска параметра, или передачи параметра не того типа что ожидается. У меня был трудно уловимый баг когда я вместо string.c_str() передавал просто string, сеанс отладки был просто "чудесен".

Решение:
class StringBuilder {
protected:
    std::stringstream mStream;
public:
    explicit StringBuilder( const char * str ) {
        stringstream::sync_with_stdio(false);
        mStream << str;
    }
    explicit StringBuilder(  ) {
        stringstream::sync_with_stdio(false);
    }
    template<class T>
    StringBuilder & operator<< (const T& arg) {
        mStream << arg;
        return *this;
    }
    operator string() const {
        return mStream.str();
    }
    const char * ToCStr() {
        return mStream.str().c_str();
    }
};
Позволяет форматировать строки так:
StringBuilder( "DIPs: " ) << ruDIPs() << "\nTCs: " << ruTextureUsedPerFrame() << "\nFPS: " << fpsCounter.fps;
Можете закидать меня какашками, и говорить что << это быдлокод и прочее "ко-ко-ко" и вообще очень медленно. Так вот профайлер говорит обратное, юзабельность тоже.
На самом деле стандарт С++ описывает только поведение и формат функционала стандартной бибилиотеки, но реализация лежит на разработчике этой библиотеки. Таким образом в разных компиляторах или даже разных их версиях скорость может быть разной, однако можно однозначно сказать что обычно потоки С++ удобней библиотек С (в некоторых случаях наоборот).
Так что если в данном случае профайлер показывает больше скорости, это не значит что в других случаях будет также.
Ещё можно предположить что выделять сразу 512 байт видимо много, ещё лучше подобрать длину строк или использовать расшаренную память (как обычно делается внутри строк и потоков С++) то можно повысить скорость.
Сам я обычно использую std::stringstream и не оборачиваю его в какой-то класс.
Нужно иметь ввиду что ::sync_with_stdio статический и влияет на все потоки сразу -- его можно вызвать один раз, за пределами класса, как следствие и необходимость класса отпадает.
А вообще в выводе строк главное удобство, это же не рендер строк, а только их компоновка, я не думаю что оно требует таких умственных затрат (я имею ввиду что-то более сложное чем чистый stringstream).
(Offline)
 
Ответить с цитированием