1. Си / Говнокод #6378

    +145

    1. 1
    2. 2
    3. 3
    //Determine padding for use in allocating new memory
    int padding = 0;
    while ( (width * 3 + padding) % 4 != 0) padding++;

    http://www.cplusplus.com/forum/windows/6353/
    Ещё одна история о том, как людям не дано запомнить двоичную природу данных.
    Если что, вот корректный шаблон на D:

    int packed(int alignment)(int location) {
    static assert(alignment == 2 | alignment == 4 | alignment == 8);
    const badEnd = alignment - 1; //0b11, 0b111, 0b1111
    return location & badEnd ? (location & ~badEnd) + alignment : location;
    }

    Запостил: denis-sh, 16 Апреля 2011

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

    • я смотрю вы тоже слегка притормаживаете. и alignment традиционно задается степенью двойки, что бы вот такое Г не городить как вы сверху.

      то что делает это цикл заменяется на `padding = width % 4`. что в контексте есть имо говно. да там вся функция слегка попахивает.

      выравнивание делается *намного* проще:
      alignment = 1<<power2;
      location = (location + (alignment-1)) & ~(alignment-1);
      и это такая древняя классика системного программирования, что просто стыдно это не знать.
      Ответить
      • Полностью признаю свою ошибку (безграмотность) при создании лишнего ветвления. Однако, не вижу ничего плохого в задании alignment именно шагом (да, 2, 4 и 8 взялись просто из одного прикладного случая).
        Ответить
      • (location + (alignment-1)) / alignment * alignment;

        Для произвольного alignment.
        Ответить

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