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

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

Голосование
Вопрос: Почему QPoint/QVector не template ?
Меньше template = лучше - 1 (14.3%)
Тролли всегда правы - 0 (0%)
Потому что это UI - 2 (28.6%)
Правильно что нет, потому что..) - 1 (14.3%)
Ваш вариант - 3 (42.9%)
Всего голосов: 7

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Почему QPoint/QVector не template ?  (Прочитано 19364 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #30 : Июль 08, 2016, 13:41 »

Цитировать
Скорость выполнения на темплейтах часто быстрее

Скорость ВЫПОЛНЕНИЯ быстрее не будет, т.к. темплейты по сути - это макросы, которые разворачиваются в полноценный С-код перед тем, как он будет скомпилирован. Я же говорю о скорости КОМПИЛЯЦИИ. Чем больше в проекте темплейтов - тем медленнее он собирается. Вполне возможно, что это была одна из причин, побудивших троллей отказаться от темплейтов.
Записан

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Июль 08, 2016, 15:19 »

Ну хорошо, в любом случае менять все вызовы на темплейты уже поздно. Но тогда почему не так
Код
C++ (Qt)
typedef Point<int, 2> QPoint;
typedef Point<qreal, 2> QPointF;
 
void QPainter::drawLine(const QPoint & p1, const QPoint & p2);
void QPainter::drawLine(const QPointF & p1, const QPointF & p2);
А внутри уже вызвать template вариант, напр

Код
C++ (Qt)
void QPainter::drawLine(const QPoint & p1, const QPoint & p2)
{
return QPainter::drawLine_template_helper(p1, p2);
}
 
Так можно схлопнуть немало кода, можно создавать свои инстансы (пример с QVectir3D double), ну а кто побойчее - cможет и xxx_template вызовы прикрутить.
Записан
Bepec
Гость
« Ответ #32 : Июль 08, 2016, 16:59 »

Потому что как уже говорилось - это даёт им возможность сделать разные реализации drawLine, имея при этом контроль параметров компилятором.

Всё что вы предлагаете усложняет код, но не даёт никаких преимуществ. Вот вообще никаких на мой взгляд.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Июль 08, 2016, 17:34 »

Потому что как уже говорилось - это даёт им возможность сделать разные реализации drawLine, имея при этом контроль параметров компилятором.

Всё что вы предлагаете усложняет код, но не даёт никаких преимуществ. Вот вообще никаких на мой взгляд.
Ладно, вот написали Вы чего-то "на шару", типа "авось угадаю, а если нет - мне объяснят, и так я получу новые знания" (сомнительный способ). Ну поясните почему Вы никогда не попадаете в такт/масть? Если уж гадаете - то должны же хоть когда-то угадывать - но этого не происходит. Ну почему Ваши ответы просто неразумны (о какой-то полезности я уже молчу)?
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #34 : Июль 08, 2016, 17:39 »

Скорость ВЫПОЛНЕНИЯ быстрее не будет, т.к. темплейты по сути - это макросы, которые разворачиваются в полноценный С-код перед тем, как он будет скомпилирован. ...

Шаблонные методы используются компилятором в виде реализаций прямо в заголовочных файлах, в то время как нешаблонные обычно скрыты внутри исходников. Таким образом множество шаблонных методов воспринимаются компилятором как inline или constexpr, что позволяет обеспечить более эффективную оптимизацию (конечно за счет увеличения размера бинарника). Шаблоны могут и отрицательно на скорость влиять, если сгенерированный код (увеличенный в размерах по сравнению с обычным) не помещается в кеш процессора. Но как пишут специалисты: "Шаблоны имеют положительное воздействие на скорость намного чаще, чем отрицательное".
Записан
Bepec
Гость
« Ответ #35 : Июль 08, 2016, 17:43 »

А вы опровергните мои слова. Тогда у нас выйден спор. А в конце спора, если вы не убежите от темы(как обычно), мы получим вывод - правдиво ли это и имеет ли право на существование.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #36 : Июль 08, 2016, 18:44 »

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

Конечно. И именно поэтому компилятор каждый раз заново перекомпилирует шаблонный код, который находится в инклуде. В то время как cpp-файл требуется пересобрать только 1 раз. Чем больше шаблонов, тем медленнее компиляция. Для больших проектов это часто фатально.

Шаблоны могут и отрицательно на скорость влиять, если сгенерированный код (увеличенный в размерах по сравнению с обычным) не помещается в кеш процессора.

Непонимающий

Но как пишут специалисты: "Шаблоны имеют положительное воздействие на скорость намного чаще, чем отрицательное".

Какие специалисты? Где они?
Записан

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Июль 08, 2016, 18:46 »

А вы опровергните мои слова. Тогда у нас выйден спор.
Улыбающийся Не думаю. Вы такое пишете что опровергать уже как-то неудобно  Улыбающийся

Потому что как уже говорилось - это даёт им возможность сделать разные реализации drawLine, имея при этом контроль параметров компилятором.
Каждая "инстанса" темплейта - разная, и типизированный контроль для нее никак не менее строг. Это пишется один раз, а "инстанциироваться" может сколько угодно - и каждый раз все будет откомпилено как будто было скопи-пастено. Вы раз 100 это слышали хотя бы на этом форуме - ну зачем нести такую пургу?  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Июль 08, 2016, 18:58 »

Шаблонные методы используются коШаблоны могут и отрицательно на скорость влиять, если сгенерированный код (увеличенный в размерах по сравнению с обычным) не помещается в кеш процессора. Но как пишут специалисты: "Шаблоны имеют положительное воздействие на скорость намного чаще, чем отрицательное".
Верю (кстати не знал об этом).

Но все-таки четкого ответа "почему так в Qt" как-то не звучит. Вроде бы случай хрестоматийный, можно даже сказать "ну если это не темплейтить, то что же тогда темлейтить?"

Кстати вот интересно: допустим в либе есть какая-то темплейтщина, напр
Код
C++ (Qt)
template <class T>
void SomeClass::SomeMethod( T & );
 
Но в той же либе уже есть какие-то инстанциации. Что будет когда либа подключается - бросится ли он опять "инстанциировать" - или сможет просто слинковать имеющиеся?
Записан
Bepec
Гость
« Ответ #39 : Июль 08, 2016, 19:40 »

Фраза: В Qt почти не используются темплейты.

Что думает Igors: Разработчики не умеют работать с темплейтами, поэтому они создали библиотеку без них. Однако полностью отказаться не смогли, поэтому им стыдно и это выражает глубокую депрессию тимлида.

Что имели в виду разработчики: Напишем без темплейтов млеать Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Июль 09, 2016, 12:24 »

Что думает Igors: Разработчики не умеют работать с темплейтами,
Я думаю тамошние разработчики умеют работать с темплейтами дай бог всякому. Но почему-то здесь они (явно сознательно) уклонились от них. Причины этого решения мне хотелось бы уяснить.

Ладно, зайдем с др стороны. Да, дублируется код QPoint и QPointF чтобы иметь четкую организацию проекта/либы (а не вакханалию с хедерами). Меня это объяснение устраивает. Но остается еще немало

QVector2D
QVector3D
QVector4D

Ну они-то почему не template? На них ведь нет завязок QPainter и др
Записан
Bepec
Гость
« Ответ #41 : Июль 09, 2016, 12:36 »

Да уже десятки раз отвечали, если подумать. Структура Qt должна быть проста и понятна. У неё самый низкий порог вхождения среди всех языков программирования, что даёт нехилое такое преимущество.

Вот вы хотите шаблонов, но какая выгода от шаблонов будет?
Причина "дублирование кода" не принимается -  это скорее вопрос стиля, а не эффективности UI библиотеки Qt.

Уберём простоту Qt, добавим пару десятков шаблонов, наплодим фабрики и функторы где надо и где не надо и получим второй буст, страшный и непонятный для новичков. В котором используется дай боже 10% всех возможностей, а оставшиеся 90% не знает никто, кроме разработчиков.

PS наглядный пример - если что то не работает в Qt, всегда можно посмотреть в исходном коде, что и как там происходит. Чтобы сделать то же самое в бусте, нужен как минимум полугодовой опыт в расшифровке шаблонов.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #42 : Июль 10, 2016, 11:07 »


QVector2D
QVector3D
QVector4D

Ну они-то почему не template? На них ведь нет завязок QPainter и др

Ну потому что это получится что-то типа тупля (ха-ха, смешное слово - тупель) со всеми вытекающими.
Код:
QVector3d v;
v.setX(1);
v.setY(1);
v.setZ(1);

Код:
QVectorXd<3> v;
v[0] = 1;
v[1] = 1;
v[2] = 1;

(или какой там синтаксис сеттеров у тупля)

Это касательно размерности.

Касательно дабл-флоат - кажется, я уже отвечал, когда они писались, не все платформы поддерживали дабл (это сейчас qreal в дабл всегда дефайнится). Думаю, в Qt6 они станут дабловыми (если будет такая нужда)

Из мейл-листа:
Цитировать
For most of graphics floats is the "right" choice as it maps directly to OpenGL, is storage-wise efficient and quality-wise precise enough. Then for the cases where precision is very important, we should explicitly use double.
« Последнее редактирование: Июль 10, 2016, 11:15 от Авварон » Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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