Меня интересует выравнивание адреса в бóльшую сторону, я знаю, что можно посчитать остаток от деления адреса на выравнивания, и затем прибавить его к адресу, но можно ли сделать это как-то быстрее? Например с помощью битовых операций.
можно посчитать остаток от деления адреса на выравнивания, и затем прибавить его к адресу, но можно ли сделать это как-то быстрее? Например с помощью битовых операций.
Можно, если выравнивание по степени двойки. addr = (addr + alignment - 1) & -alignment
jcmvbkbc, позволю себе спросить ещё вот что: можно ли выравнять адрес до ближайшей к нему степени двойки (в большую сторону)? 1000 -> 1024, 3000 ->4096 и т.д.
позволю себе спросить ещё вот что: можно ли выравнять адрес до ближайшей к нему степени двойки (в большую сторону)? 1000 -> 1024, 3000 ->4096 и т.д.
Есть быстрый алгоритм нахождения ближайшей большей степени двойки для числа. В данном случае адрес можно рассматривать как целое число.
Найти его можно тут: https://github.com/gibsjose/BitHacks/blob/master/B... среди других подобных алгоритмов. Там правда он рассчитан на 32битное целое, но по аналогии его можно привести к 64битному.
Для выравнивания адреса я использую обычно этот вариант: addr = (addr | (alignment - 1)) + 1;
Где alignment - степень двойки.
И точно. Даже 1 раз попадал, похоже, на эту ошибку, что приводило к выходу за гранцы буфера. Каким-то костылем тогда вышел из положения, но причину не понял. Спасибо!