Russian Qt Forum
Ноябрь 24, 2024, 14:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Голосование
Вопрос: Всегда ли вы используете QString для строк? (примеры в сообщении)
Всегда - 17 (73.9%)
Не всегда - 6 (26.1%)
Всего голосов: 6

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Всегда ли вы используете QString?  (Прочитано 7806 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« : Октябрь 30, 2011, 18:35 »

Всегда, даже если можно обойтись const char *:

Код
C++ (Qt)
void anotherFunc(const QString &)
{
   ...
}
 
void func()
{
   QString a;
 
   if(...)
       a = "action1";
   else if(...)
       a = "action2";
   else
       a = "action3";
 
   anotherFunc(a);    
}
 

Не всегда, если можно обойтись const char *, и это безопасно:

Код
C++ (Qt)
void anotherFunc(const QString &)
{
   ...
}
 
void func()
{
   const char *a;
 
   if(...)
       a = "action1";
   else if(...)
       a = "action2";
   else
       a = "action3";
 
   anotherFunc(a);    
}
 
Записан
andrew.k
Гость
« Ответ #1 : Октябрь 30, 2011, 19:06 »

Можно, только зачем?
Какие плюсы у второго куска, по сравнению с первым?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 30, 2011, 19:44 »

Можно, только зачем?
Какие плюсы у второго куска, по сравнению с первым?
Если будет хороший объем текста - то очень существенные
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Октябрь 30, 2011, 19:48 »

Код
C++ (Qt)
void anotherFunc(const QString &)
{
   ...
}
 
void func()
{
   const char *a;
 
   if(...)
       a = "action1";
   else if(...)
       a = "action2";
   else
       a = "action3";
 
   anotherFunc(QLatin1String(a));    
}
 
fxd
Записан
andrew.k
Гость
« Ответ #4 : Октябрь 30, 2011, 20:11 »

Где в приведенном примере хороший объем текста?
Понятное дело, что массив чаров быстрее чем QString. Но в большинстве случаев эта разница не существенна.
И что такое существенные? 32 секунды вместо 35?
Записан
ufna
Гость
« Ответ #5 : Октябрь 30, 2011, 22:20 »

Больших сравнений текста вообще нужно избегать, таким образом по крайней мере Улыбающийся
Записан
zenden
Гость
« Ответ #6 : Октябрь 30, 2011, 23:34 »

Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.

Имхо, QString - лучший класс строки, который есть для C++. Очень жаль, что его нельзя использовать не в Qt проектах.
по идее, он должен быть быстрее, чем std::vector, т.к. использует механизм copy-on-write.

А что вы предлагаете делать с char *?? Его даже сравнить нормально нельзя.Использовать  strcmp? (кстати, в стандарте C++ даже нет функции сравнения без учета регистра!! ). Да и вообще, сырые указатели - это не модно и не безопасно.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Октябрь 30, 2011, 23:35 »

Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.
QtXml. Только и делает, что гоняет utf-8 (или другую 8битную кодировку внутри xml) в utf-16 и обратно.
Записан
andrew.k
Гость
« Ответ #8 : Октябрь 30, 2011, 23:59 »

Больших сравнений текста вообще нужно избегать, таким образом по крайней мере Улыбающийся
Ну это понятно.
В общем я за повсеместный QString, кроме случаев, когда это очень критично по производительности.
Но тогда зачем вообще qt использовать?
Меня лично бесит, когда в проекте то QString, то char *.
Записан
andrew.k
Гость
« Ответ #9 : Октябрь 31, 2011, 00:02 »

Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.
QtXml. Только и делает, что гоняет utf-8 (или другую 8битную кодировку внутри xml) в utf-16 и обратно.
По-моему неудачный пример.
раз гоняет, значит нужно. как раз экономия на спичках.
Храни данные в PlainText и читай их сишными функциями, и будет тебе очень производительно.

в qt-проектах смысла нет в char *.
« Последнее редактирование: Октябрь 31, 2011, 00:07 от andrew.k » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Октябрь 31, 2011, 00:46 »

Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.
QtXml. Только и делает, что гоняет utf-8 (или другую 8битную кодировку внутри xml) в utf-16 и обратно.
По-моему неудачный пример.
раз гоняет, значит нужно. как раз экономия на спичках.
Очень удачный. Тролли теперь страдают, что ничего с этим модулем сделать не могут, тк написали его через жопу, а совместимость не дает ничего изменить. И это не мои выдумки, это проверенная инфа.

Да, яхз зачем использовать char* если есть QByteArray.
Записан
andrew.k
Гость
« Ответ #11 : Октябрь 31, 2011, 00:52 »

поверю на слово.
Но в любом случае, получается, что проблема не собственно в QString, а в том, что написано через жопу.
Не QString же виноват, что QtXml его туда-сюда гоняет?)
« Последнее редактирование: Октябрь 31, 2011, 00:55 от andrew.k » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Октябрь 31, 2011, 01:06 »

andrew.k
Просто надо думать, когда пишите. В очень многих случаях можно обойтись батареем. Пример - QObject::objectName нафиг не нужен кустринг, достаточно батарея. Покажите мне извращенца, к-ый дает объектам в программе локализованные имена.
Записан
andrew.k
Гость
« Ответ #13 : Октябрь 31, 2011, 01:52 »

Дело не в локализованности.
Можно, например, имена использовать динамически.
Например, в калькуляторе PushButton0, PushButton1, PushButton2, ..., PushButton9
И выделять из имени последний символ в единственной для всех кнопок функции обработчике.
Тут же QString и пригодится.
И таких примеров можно массу придумать.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #14 : Октябрь 31, 2011, 02:05 »

Дело не в локализованности.
Можно, например, имена использовать динамически.
Например, в калькуляторе PushButton0, PushButton1, PushButton2, ..., PushButton9
И выделять из имени последний символ в единственной для всех кнопок функции обработчике.
Тут же QString и пригодится.
И таких примеров можно массу придумать.

Батарей всё это позволяет. Можно вспомнить, что значение символа - это его код - '0'.
Для более сложных случаев гораздо более адекватно засовывать данные в проперти (а еще у некоторых классов есть спец userData), а не в имя.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.151 секунд. Запросов: 25.