#include <cstdio> // for printf.
#include <cstddef> // for size_t.
#include <cstdint> // for uintptr_t.
using namespace std;
enum class align_size : int
{
bytes2 = 1,
bytes4 = 2,
bytes8 = 3,
bytes16 = 4,
bytes32 = 5,
bytes64 = 6,
bytes128 = 7
};
void *alignment(void *p, align_size align)
{
auto shift = static_cast<int>(align);
auto mask = (1 << shift) - 1;
auto i = reinterpret_cast<std::uintptr_t>(p);
i = (i + mask) & ~mask;
return reinterpret_cast<void *>(i);
}
void f(int i)
{
auto *p = reinterpret_cast<void *>(i);
auto *p_after = alignment(p, align_size::bytes4);
std::printf("%p -> %p\n", p, p_after);
}
int main()
{
for ( auto i = 0; i <= 9; i++ )
f(i);
getchar();
}
I2luY2x1ZGUgPGNzdGRpbz4gICAgLy8gZm9yIHByaW50Zi4KI2luY2x1ZGUgPGNzdGRkZWY+CS8vIGZvciBzaXplX3QuCiNpbmNsdWRlIDxjc3RkaW50PgkvLyBmb3IgdWludHB0cl90Lgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZW51bSBjbGFzcyBhbGlnbl9zaXplIDogaW50CnsKCWJ5dGVzMiA9IDEsCglieXRlczQgPSAyLAoJYnl0ZXM4ID0gMywKCWJ5dGVzMTYgPSA0LAoJYnl0ZXMzMiA9IDUsCglieXRlczY0ID0gNiwKCWJ5dGVzMTI4ID0gNwp9OwoKdm9pZCAqYWxpZ25tZW50KHZvaWQgKnAsIGFsaWduX3NpemUgYWxpZ24pCnsKCWF1dG8gc2hpZnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGFsaWduKTsKCWF1dG8gbWFzayA9ICgxIDw8IHNoaWZ0KSAtIDE7CgoJYXV0byBpID0gcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4ocCk7CglpID0gKGkgKyBtYXNrKSAmIH5tYXNrOwoKCXJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKj4oaSk7Cn0KCnZvaWQgZihpbnQgaSkKewoJYXV0byAqcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihpKTsKCWF1dG8gKnBfYWZ0ZXIgPSBhbGlnbm1lbnQocCwgYWxpZ25fc2l6ZTo6Ynl0ZXM0KTsKCglzdGQ6OnByaW50ZigiJXAgLT4gJXBcbiIsIHAsIHBfYWZ0ZXIpOwp9CgppbnQgbWFpbigpCnsKCWZvciAoIGF1dG8gaSA9IDA7IGkgPD0gOTsgaSsrICkKCQlmKGkpOwoKCWdldGNoYXIoKTsKfQoK