LINUX.ORG.RU

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

 , , ,


0

1

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

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

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

★★

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

Размер запросто может быть отрицательным:

for (auto i = vector.size(); i >= 0; i–) { … }

Этот код не работает если возвращается беззнаковое целое. Вообще беззнаковые это зло, поэтому в нормальных языках программирования они закопаны глубоко и так просто с ними не поработаешь.

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

Этот код не работает если возвращается беззнаковое целое

Используй оператор --> («стремится к»).

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

Я про контейнеры типа QVector, там тоже все размеры int. Соответственно, лимит на 2млрд элементов в нем. Это резко ограничивает его применимость по сравнению с нормальным std::vector

CatsCantFly
()

есть тип ssize_t - is used for functions whose return value could either be a valid size, or a negative value to indicate an error. It is guaranteed to be able to store values at least in the range [-1, SSIZE_MAX] (SSIZE_MAX is system-dependent).

и Qt тут не причом

Vinill ★★
()
Ответ на: комментарий от anonymous

>Используй оператор –> («стремится к»).
Нет такого оператора.

Конечно нет. Но разве это мешает его использовать? ;-)

for (auto i = vector.size(); i --> 0;) { … }

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

В 2019 7.5 гигов это не что-то невероятное. Сейчас и для настольного пк стандарт 64+ гб RAM, не говоря про сервера. Структурам данных на десяток-другой гб находится применение в любом серьезном софте

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

И что? Их наличие не делает «дегенеративным» указанный способ обхода. Более того, при обходе итератором теряется информация об индексе.

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

Сейчас и для настольного пк стандарт 64+ гб RAM

Это минимум. Стандарт — 256.

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

Полезли тяжеловесные костыли, но тема «дегенеративности» так и осталась нераскрытой :) Дегенеративность это тащить буст ради одной строчки кода, которая в итоге не будет лучше того, что я написал.

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

Ога, делать вычисления там где можно обойтись без них. Особенно весело будет для контейнеров без random access :)

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

Не нравится буст, есть ranges с аналогичной фичей, с будущего года уже прямо с стандартной либе, в конце концов, эта штука пишется самостоятельно на коленке за 10 минут и используется далее во всем проекте. Но лучше же конечно по заветам прадедов декрементить в цикле инт и забить на читаемость, безопасность, зато на беззнаковые типы можно пожаловаться.

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

Эти 7.5 гигов надо хранить в одном контейнере?

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

Но лучше же конечно по заветам прадедов

Ты так говоришь будто это что-то плохое.

декрементить в цикле инт и забить на читаемость,

Как раз такой код наиболее читаем чем всякие бусты, рэнджи с рюшечками и хрень из стандартов, о которой никто не знает и которой никто не пользуется!

безопасность,

При чем тут безопасность?

зато на беззнаковые типы можно пожаловаться.

Ога, именно поэтому в стандарт хотят добавить ssize() или уже добавили :) В итоге тема «генеративности» так и осталась нераскрытой :)

Reset ★★★★★
()
Ответ на: комментарий от anonymous

Не бывает, но внутри цикла этот «индекс» может использовать не только для доступа к элементу.

Reset ★★★★★
()
Ответ на: комментарий от anonymous

Ты небось и про червячок-оператор не в курсе?

for (int i = 0; i < n; i =-~ i)
    ;

Червячок переносит значение в lvalue, но он сам маленький, поэтому и значение небольшое.

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

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

assert(sizeof(int) == sizeof(unsigned));
andreyu ★★★★★
()
Ответ на: комментарий от KennyMinigun

for (size_t i = container.size(); i > 0; –i)

for (size_t i = 0, size = container.size(); i < size; i++)
{
   size_t idx = size - i - 1;
   container[idx];
}
andreyu ★★★★★
()
Ответ на: комментарий от xaizek

и в итоге он доставляет неудобства, а при этом ничего особо не привносит.

Не согласен. Нет никаких неудобств. А вносит он много - понимание, что индекс контейнера не может быть отрицательным.

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

Используй оператор --> («стремится к»).

Бить по морде за такое.

ox55ff ★★★★★
()
Ответ на: комментарий от andreyu

понимание, что индекс контейнера не может быть отрицательным.

Сокровенное знание, доступное лишь избранным.

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

Сокровенное знание, доступное лишь избранным.

Всегда можно сделать говно, но если есть возможность его не делать, то лучше его не делать. Это тоже для вас сакральное знание?

andreyu ★★★★★
()

проект на QT

Про квиктайм уже объяснили?

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

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

З.Ы. В Java этих ваших беззнаковых типов вообще нет. И как-то живут.

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

переносит значение в lvalue

Что сей набор слов значит?

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

дегенеративный способ обхода контейнера

Он не дегенеративный, просто для большинства случаев избыточный. Да, стандартное средство обхода контейнера – это итератор. Но бывают ситуации, когда явно нужно манипулировать индексом. И тут не факт, что лучше – инкрементировать этот индекс вручную, или тупо сделать цикл со счётчиком. Особенно с учётом, что второй вариант зачастую даже выглядит компактнее. :)

hobbit ★★★★★
()
Ответ на: комментарий от anonymous

Говно потому, что я ск0зал. А - аргументация.

Силюсь понять вы по жизни дурак или только в данном случае?

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.