fork download
  1. #include <vector>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. template <typename T>
  7. void log_alignment(const T* t)
  8. {
  9. unsigned long long address = reinterpret_cast<unsigned long long>(t);
  10.  
  11. int max_alignment_check = 1024;
  12. for (; max_alignment_check>1; max_alignment_check/=2)
  13. {
  14. if (address % max_alignment_check == 0)
  15. break;
  16. }
  17.  
  18. std::cout << "Address 0x" << std::hex << address << " is " << std::dec << max_alignment_check << " bytes aligned.\n";
  19. }
  20.  
  21. struct B {
  22. alignas(128) float data[32];
  23. };
  24.  
  25. int main()
  26. {
  27. B b1;
  28. B* b_ptr = new B;
  29. B* b_arr = new B[2];
  30. std::vector<B> b_vec1(10);
  31. std::vector<B> b_vec2(10);
  32. B b2;
  33.  
  34. log_alignment(&b1);
  35. log_alignment(&b2);
  36. log_alignment(b_ptr);
  37. log_alignment(b_arr);
  38. log_alignment(b_vec1.data());
  39. log_alignment(b_vec2.data());
  40. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Address 0xffffffffbfbf2780 is 128 bytes aligned.
Address 0xffffffffbfbf2800 is 1024 bytes aligned.
Address 0xa047008 is 8 bytes aligned.
Address 0xa047090 is 16 bytes aligned.
Address 0xa047198 is 8 bytes aligned.
Address 0xa0476a0 is 32 bytes aligned.