Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 13.02.2015, 18:53   #1
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,569
Написано 544 полезных сообщений
(для 1,526 пользователей)
Велик для форматирования строк

Это
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;
Можете закидать меня какашками, и говорить что << это быдлокод и прочее "ко-ко-ко" и вообще очень медленно. Так вот профайлер говорит обратное, юзабельность тоже.
__________________
Junior Tools Programmer at Larian Studios
ПеКа: AMD Ryzen 1700X 8@3.4 ГГц, 16 Гб ОЗУ,

NVIDIA GTX 960 4 Гб, SSD Samsung 960 EVO 500 Гб
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Samodelkin (13.02.2015)
Старый 13.02.2015, 19:53   #2
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 977
Написано 388 полезных сообщений
(для 630 пользователей)
Ответ: Велик для форматирования строк

Сообщение от 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).
__________________
Config1: Windows 10 x64 / Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1920x1080; Intel Core i7 930 @ 2.80GHz; DDR3 9GB Triple; AMD Radeon R9 290 4GB; SSD Ignition 2 120GB; HDD Seagate 1TB.
Config2: Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1366x768; Intel Pentium Dual-Core T4400 @ 2.20GHz; DDR2 2GB; NVIDIA GeForce G105M; HDD WD 250GB.
(Offline)
 
Ответить с цитированием
Старый 13.02.2015, 19:57   #3
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,569
Написано 544 полезных сообщений
(для 1,526 пользователей)
Ответ: Велик для форматирования строк

Подобный велик помогает убрать такое говно:
stringstream data;
data<< "foo" << 123 << "bar" ;
doSomething( data.str() );
Заместо него будет
doSomething( StringBuilder( "foo" ) << 123 << "bar" );
Так что класс нужен.
__________________
Junior Tools Programmer at Larian Studios
ПеКа: AMD Ryzen 1700X 8@3.4 ГГц, 16 Гб ОЗУ,

NVIDIA GTX 960 4 Гб, SSD Samsung 960 EVO 500 Гб
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Samodelkin (13.02.2015)
Старый 13.02.2015, 20:14   #4
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 977
Написано 388 полезных сообщений
(для 630 пользователей)
Ответ: Велик для форматирования строк

Можно создать макрос, или создать статический метод вместо класса -- тогда не будет оверхеда на создание/удаление класса.
Можно создать логгер, который существует всё время, а внутри него stringstream, тоже существующий всё время. А добавлять данные так:
logger.getStream() << "ololo" << value1 << someClass;
doSomething( logger.getString() );
__________________
Config1: Windows 10 x64 / Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1920x1080; Intel Core i7 930 @ 2.80GHz; DDR3 9GB Triple; AMD Radeon R9 290 4GB; SSD Ignition 2 120GB; HDD Seagate 1TB.
Config2: Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1366x768; Intel Pentium Dual-Core T4400 @ 2.20GHz; DDR2 2GB; NVIDIA GeForce G105M; HDD WD 250GB.
(Offline)
 
Ответить с цитированием
Старый 14.02.2015, 16:08   #5
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: Велик для форматирования строк

Сообщение от mr.DIMAS Посмотреть сообщение
Подобный велик помогает убрать такое говно:
stringstream data;
data<< "foo" << 123 << "bar" ;
doSomething( data.str() );
Заместо него будет
doSomething( StringBuilder( "foo" ) << 123 << "bar" );
Так что класс нужен.
Немного не понял. А что мешает делать:
doSomething( stringstream("foo")   << 123 << "bar" );
Ну т.е. не менее уродливо, но без лишнего класса.
Против класса ничего не имею, просто аргумент не очень.
(Offline)
 
Ответить с цитированием
Старый 14.02.2015, 19:26   #6
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,569
Написано 544 полезных сообщений
(для 1,526 пользователей)
Ответ: Велик для форматирования строк

Ну как минимум то что нужно делать вот так если в doSomething передается строка:
doSomething( (stringstream("foo")   << 123 << "bar").str() );
__________________
Junior Tools Programmer at Larian Studios
ПеКа: AMD Ryzen 1700X 8@3.4 ГГц, 16 Гб ОЗУ,

NVIDIA GTX 960 4 Гб, SSD Samsung 960 EVO 500 Гб
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 21:29.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com