Няшная / Говнокод #6378 Ссылка на оригинал

0

  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 denis-sh, (Updated )

Комментарии (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.
      Ответить

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

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

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


    8