Кресты / Говнокод #17627 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
// 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);

Запостил: Dummy00001 Dummy00001, (Updated )

Комментарии (13) RSS

  • gcc такие циклы ещё не научился сворачивать в деление?
    Ответить
    • хез. лень полный тест делать. на простом тесте гцц все в компайл тайме все заэвалил.
      Ответить
      • Для беззнакового цикл оставил, как и ожидалось. А вот для знакового в ((size - 1) >> 2) + 1 соптимизнул (с проверкой на 0 само собой). Вот что UB животворящий делает...
        Ответить
        • стоп. если он проверку на ноль оставил, тогда где там ЯБ с беззнаковой переменной?
          Ответить
          • Ну в том то и дело, что UB есть со знаковой переменной. Компилер знает, что m_blockSize не переполнится (иначе UB) и может заменить всю эту хуйню на сдвиг.

            А с unsigned'ом походу боится проебать зависание на слишком больших blockSize.
            Ответить
            • > боится проебать зависание на слишком больших blockSize
              Да, так и есть. Добавил
              if (size > UINT_MAX - 3)
                  return 0;
              и всё соптимизнулось в сдвиг.
              Ответить
              • компилеры умнее людей. ничего хорошего для будущего человечества не предвещает.
                Ответить
                • Хех, т.е. если компилятор не хочет что-то оптимизировать - это намёк, что там таится какая-нибудь фигня типа зависания при каких-то входных данных?
                  Ответить
                  • ... но даже если и оптимизирует - то исходит из того что на мину ты преднамеренно хотел наступить.

                    армагедон - skynet просто съоптимизировало человечество в nop.
                    Ответить
            • А зачем тогда в stl юзают unsigned для size_t? Ведь оно мешает оптимизации.
              Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8