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

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #30 : Февраль 23, 2016, 22:13 »


Справедливости ради надо отметить что тролли учли критику и сделали QStringRef::split. Вообще QStringRef - отличный класс, практически без накладных расходов.

Справедливости ради, в Qt6 уберут QStringRef и сделают, чтобы QString сам себе был рефом. И QString::split магическим образом перестанет аллоцировать память. И вам придется переписать код взад. Выпендриваясь "потому что это неоптимально", вам придется дважды написать один и тот же код.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #31 : Февраль 24, 2016, 01:02 »

Там где разбирают текстовые файлы - там вообще пофиг на производительность.

а если файл на десяток гигов? которые надо быстро распарсить и обработать?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #32 : Февраль 24, 2016, 02:02 »

Текстовый формат и быстродействие - это две большие разницы. Во всяком случае бинарные форматы оставляют текстовые форматы далеко позади по быстродействию.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Февраль 24, 2016, 09:37 »

Справедливости ради, в Qt6 уберут QStringRef и сделают, чтобы QString сам себе был рефом. И QString::split магическим образом перестанет аллоцировать память.
Вы очень много читаете, а я почти ничего (все время съедает предметная часть). Тем не менее (да-да, ничего не слышав) рискну утверждать что этого не произойдет, рефом QString не станет. Просто потому что это уже др сущность, а значит уже и др класс. А вот что Вы верите в такие "сказки про белого бычка"....  Улыбающийся

И вам придется переписать код взад. Выпендриваясь "потому что это неоптимально",
"говно", "Выпендриваясь" и.т.п. - так грубо реагируя Вы только показываете что боитесь за свой код.  Да и вообще грубить нехорошо, и главное - совершенно неэффективно  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #34 : Февраль 25, 2016, 15:04 »

Вы очень много читаете, а я почти ничего (все время съедает предметная часть). Тем не менее (да-да, ничего не слышав) рискну утверждать что этого не произойдет, рефом QString не станет. Просто потому что это уже др сущность, а значит уже и др класс. А вот что Вы верите в такие "сказки про белого бычка"....  Улыбающийся

Не-а, тот же. Сейчас QString это
Код:
class QString { QStringData *d; }
class QStringData { QAtomicInt ref; qptrdiff offset; int size; int alloc; } // qptrdiff для литералов
А достаточно переделать
Код:
class QString { QChar *begin; int size; QStringData *d; } // для литералов уже дифф уже не нужен, d==nullptr
class QStringData { QAtomicInt ref; QChar *begin; int alloc; }

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Февраль 25, 2016, 16:57 »

Не-а, тот же. Сейчас QString это
Лазить в этих потрохах нет необходимости (вообще изучение исходников Qt хорошо до определенного предела).
Код
C++ (Qt)
QString src("a b c ...");
QString sub = SomeMagic(src);
 
Допустим с помощью имплисит шары мы сделали так что sub не аллоцирует свои данные, а ссылается напр на "a" в src. Это возможно, но тогда при первом же неконстантном обращении к src надо копировать ее данные отдельно. Тогда sub должен ответить за удаление оригинала. Не слабо выходит - используется одно "а", а хранится вся строка, может неск метров Улыбающийся Да и копирование может оказаться куда расходнее чем создание крохотного sub. В общем типичный "implcit" (не только в Qt, а неявное действие вообще) - всегда выглядит ну очень заманчиво, но расплата неизбежна  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #36 : Февраль 25, 2016, 18:50 »

QStringRef копировать тоже дорого, и что?
QStringRef тоже валиден, пока валидна исходная строка "на несколько метров".
Только при неявной шаре вы не выстрелите себе в ногу, удалив исходную строку.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Февраль 26, 2016, 06:40 »

QStringRef копировать тоже дорого, и что?
QStringRef тоже валиден, пока валидна исходная строка "на несколько метров".
Только при неявной шаре вы не выстрелите себе в ногу, удалив исходную строку.
Не понял, как же дорого если данных QStringRef с гулькин нос?  QStringRef - это чистой воды explicit, где все определено явно. Начиная с названия класса, всем видно - ссылка. Это хорошо и правильно, так и надо делать. Да, изменю исходную строку - огребу, но мне было прекрасно известно что менять нельзя. Сам виноват - сам исправлю, и это куда проще и лучше чем кто-то за меня будет чего-то делать втихаря.

Ну хорошо, а откуда неуемное желание застрелить QStringRef? Улыбающийся Читает по константному указатели и меняет пару индексов. Каким же принципам или правилам языка это противоречит?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #38 : Февраль 26, 2016, 12:51 »

Не понял, как же дорого если данных QStringRef с гулькин нос?  QStringRef - это чистой воды explicit, где все определено явно. Начиная с названия класса, всем видно - ссылка. Это хорошо и правильно, так и надо делать. Да, изменю исходную строку - огребу, но мне было прекрасно известно что менять нельзя. Сам виноват - сам исправлю, и это куда проще и лучше чем кто-то за меня будет чего-то делать втихаря.

Ну вы сами привели юзкейз, абсолютно нерелевантный использованию стрингрефа, он тут не нужен:
Код:
QStringRef ref = str.midRef(1, 5);
QString copy(ref);
copy.trim();

Реф нужен, чтобы работать с кусками исходной строки (например, частями пути к файлу), почти всегда это readonly доступ. Максимум, что я могу придумать на write - это replace конкретных символов, что-то более сложное надо делать на исходной строке, чтобы рефы не поехали.

Ну хорошо, а откуда неуемное желание застрелить QStringRef? Улыбающийся Читает по константному указатели и меняет пару индексов. Каким же принципам или правилам языка это противоречит?
Есть желание застрелить его и заменить на QStringView:
Код:
class QStringView { QChar *begin, QChar *end; }
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #39 : Февраль 26, 2016, 12:59 »

Мой поинт в чем - сделать эффективный mid()/split() можно и без QStringRef/QStringView и сидеть писать многокод "потому что так быстрее" смысла нет (если не доказано профайлером, что именно это является узким местом).
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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