1. C++ / Говнокод #17627

    +52

    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, 12 Февраля 2015

    Комментарии (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? Ведь оно мешает оптимизации.
                Ответить
          • Нынче компиляторы умнее многих людей стали
            Ответить
            • > Нынче компиляторы умнее многих людей стали
              Просто люди деградировали.
              Ответить

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