LINUX.ORG.RU

QT — размеры в int  — что за бред оО? Или я чего то не понимаю?

 , , ,


0

1

тут копался в чужом коде — куча несостыковок по типам — то беззнаковый в знавковый переводится, то обратно...

проект на QT, ходил много раз в либы ентого фреймворка и смарел, как в нем размеры хранятся в int...

но внимание вопрос — как размер может быть отрицательным?
зачем тогда использовать знаковый тип, если можно использовать беззнаковый?

★★

Ответ на: комментарий от DELIRIUM

В Qt у встроенного вектора и других контейнеров тип размера int.

https://doc.qt.io/QT-5/qvector.html#size

https://doc.qt.io/QT-5/qvector.html#operator-5b-5d

safocl

Всё норм, Qt копировали Java когда создавались, там тоже int в размерах у контейнеров.

fsb4000 ★★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от andalevor

хотя по смыслу там отрицательных значений быть не может

так в том то и дело, а зачем тогда, если беззнаковый тип экономичнее к памяти, а в данном случае знак не нужен... т.е. половина значений не используется?

safocl ★★ ()

ну и про проект где много неявных кастов, и даже как по мне просто ужасных, — а так же сравнения через == и != чисел с плавающей точкой — енто мой любимый QmPlay2

он собирается с 11 стандартом — я же хачу чо бы он норм собирался с -Wall -Wextra -Werror -std=c++17

safocl ★★ ()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от anonymous

Qt - 1991 год, Java - 1995 год.

И?

в Qt1 и были и size и индексы unsigned. Поищи доки.

\fn type &QArray::at( uint index ) const
Returns a reference to the element at position \e index in the array.

Потом появилась Java и Qt пошли копировать Java, откуда и int и итераторы как в Java.

while(it.hasNext()) {
    if (it.next() == "Библиотека Qt") {
       it.setValue("Профессиональное программирование на С++");
       }
    qDebug() << it.peekPrevious();
}
fsb4000 ★★★★ ()
Ответ на: комментарий от anonymous

экономичнее к памяти

Купи память, нищеброд!
Экономить надо человеческую память, а не компьютерную.

Притом в более новых функциях апи уже используют unsigned(long), что как бы намекает.

Это заговор яйцеголовых, чтобы комитеты создавались и финансировались. Они же пропихнули во всюда C++ вместо Delphi, чтобы потом на C++ переизобрести Delphi в виде Qt

Bad_ptr ★★★★ ()

Есть один плюс использования знаковых типов для размеров и индексов: когда надо проиндексировать что-то с конца в начало:

for (int i = container.size(); i >= 0; --i) {
  container[i];
}

Для unsigned доводится городить извращения вроди:

for (size_t i = container.size() - 1; i < container.size(); ++i) {
  container[i];
}

или так:

for (size_t i = container.size(); i > 0; --i) {
  container[i - 1];
}

Или использовать итераторы

KennyMinigun ★★★★★ ()

Размер хранят в знаковом типе как раз чтобы избежать лишних кастов. Самый банальный пример это обход элементов в цикле в обратную сторону, с беззнаковым размером это менее удобно. По сути беззнаковый размер это хорошо, но его всё равно часто используют там, где отрицательные значения могут появиться, и в итоге он доставляет неудобства, а при этом ничего особо не привносит.

xaizek ★★★★★ ()

Производить вычисления лучше, используя знаковые типы, а битовые операции можно делать только с беззнаковыми (иначе получишь undefined behavior). Довольно часто в существующем C++ коде этим моментам внимание не уделяется вообще: двигают биты в int, мешают unsigned и int в вычислениях, короче полный треш и угар.
Есть мнение, что по возможности везде следует использовать знаковые типы и size_t в STL контейнерах - досадное недоразумение.
Лично я стараюсь везде использовать signed типы и просто преобразую unsigned в signed и наоборот там, где это необходимо. Интересный момент, как именно делать это преобразование. Простой static_cast тупо замаскирует проблему, поэтом я пользуюсь самописным narrow_cast, который бросает исключение в случае, если значение не может быть преобразовано в заданный тип. Можешь нагуглить реализацию narrow_cast (я находил несколько вариантов) или написать сам. Обычно отличия в том, дергается ли внутри assert или бросается исключение.

m0rph ★★★★★ ()
Последнее исправление: m0rph (всего исправлений: 1)

С некоторого времени человечество осознало (есть учебники по C++ от 94-го года, где это уже пропагандируется), что беззнаковые типы это зло и реально необходимость в них была только во времена 16-битных int-ов.

anonymous ()

Самое идиотское, что он не только знаковый, но и 32 битный на распространённых платформах, что делает контейнеры из qt в принципе неюзабельными

CatsCantFly ()
Ответ на: комментарий от CatsCantFly

https://youtu.be/Puio5dly9N8?t=774 Тут тоже макаки из мира жабоскрипта собрались?

Для Ъ: некий Bjarne Stroustrup советует «Use ints until you have a reason not to. Don’t use unsigned unless you are fiddling with bit patterns, and never mix signed and unsigned».

NeXTSTEP ★★ ()
Последнее исправление: NeXTSTEP (всего исправлений: 1)
Ответ на: комментарий от anonymous

что беззнаковые типы это зло и реально необходимость в них была только во времена 16-битных int-ов.

Ты с дуба рухнул? Какое зло?! Если тебе три инта хранить то да, если у тебя эдак пару миллионов структур в памяти, уж изволь. А если ещё и записывать надо в фалы то ваще окстись!

LINUX-ORG-RU ★★ ()
Ответ на: комментарий от anonymous

Я имел в виду запись больших блоков данных, если есть число которое помещается в uint16_t, но не помещается в int16_t логично хранить его в uint16_t, а не в uint32_t. Я вот про это. Знаковые нужны и удобны, но это не значит что без знака зло.

off_t

смещения, в их смысл заложено что они могут быть отрицательны относительно какого либо положения. Тут всё норм. Знак тут как флаг направления смещения, сложно придумать что-то иное. Тут всё идеально.

LINUX-ORG-RU ★★ ()