Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
// round up the blockSize to fit an integer number of pointers...
m_blockSize = static_cast<QMPoolSize>(sizeof(QFreeBlock));//start with one
uint_fast16_t nblocks = uf16_1; //# free blocks in a memory block
while (m_blockSize < static_cast<QMPoolSize>(blockSize)) {
m_blockSize += static_cast<QMPoolSize>(sizeof(QFreeBlock));
++nblocks;
}
в догонку к #17616. делим на 4 с округлением, с помощью цикла.
P.S. касты и цикл само собой разумеется в ж не нужны:
m_blockSize = (blockSize + sizeof(QFreeBlock)-1) & ~(sizeof(QFreeBlock)-1);
nblocks = m_blockSize / sizeof(QFreeBlock);
Для беззнакового цикл оставил, как и ожидалось. А вот для знакового в ((size - 1) >> 2) + 1 соптимизнул (с проверкой на 0 само собой). Вот что UB животворящий делает...
Ну в том то и дело, что UB есть со знаковой переменной. Компилер знает, что m_blockSize не переполнится (иначе UB) и может заменить всю эту хуйню на сдвиг.
А с unsigned'ом походу боится проебать зависание на слишком больших blockSize.
А с unsigned'ом походу боится проебать зависание на слишком больших blockSize.
Да, так и есть. Добавили всё соптимизнулось в сдвиг.
армагедон - skynet просто съоптимизировало человечество в nop.
Просто люди деградировали.