fork download
  1. #include <cstdio> // for printf.
  2. #include <cstddef> // for size_t.
  3. #include <cstdint> // for uintptr_t.
  4. using namespace std;
  5.  
  6. enum class align_size : int
  7. {
  8. bytes2 = 1,
  9. bytes4 = 2,
  10. bytes8 = 3,
  11. bytes16 = 4,
  12. bytes32 = 5,
  13. bytes64 = 6,
  14. bytes128 = 7
  15. };
  16.  
  17. void *alignment(void *p, align_size align)
  18. {
  19. auto shift = static_cast<int>(align);
  20. auto mask = (1 << shift) - 1;
  21.  
  22. auto i = reinterpret_cast<std::uintptr_t>(p);
  23. i = (i + mask) & ~mask;
  24.  
  25. return reinterpret_cast<void *>(i);
  26. }
  27.  
  28. void f(int i)
  29. {
  30. auto *p = reinterpret_cast<void *>(i);
  31. auto *p_after = alignment(p, align_size::bytes4);
  32.  
  33. std::printf("%p -> %p\n", p, p_after);
  34. }
  35.  
  36. int main()
  37. {
  38. for ( auto i = 0; i <= 9; i++ )
  39. f(i);
  40.  
  41. getchar();
  42. }
  43.  
  44.  
Success #stdin #stdout 0s 2900KB
stdin
Standard input is empty
stdout
(nil) -> (nil)
0x1 -> 0x4
0x2 -> 0x4
0x3 -> 0x4
0x4 -> 0x4
0x5 -> 0x8
0x6 -> 0x8
0x7 -> 0x8
0x8 -> 0x8
0x9 -> 0xc