#include <vector>
#include <iostream>

using namespace std;

template <typename T>
void log_alignment(const T* t)
{
  unsigned long long address = reinterpret_cast<unsigned long long>(t);  

  int max_alignment_check = 1024;
  for (; max_alignment_check>1; max_alignment_check/=2)
  {
    if (address % max_alignment_check == 0)
      break;
  }

  std::cout << "Address 0x" << std::hex << address << " is " << std::dec << max_alignment_check << " bytes aligned.\n";
}

struct B {
  alignas(128) float data[32];
};

int main()
{
  B b1;
  B* b_ptr = new B;
  B* b_arr = new B[2];  
  std::vector<B> b_vec1(10);
  std::vector<B> b_vec2(10);
  B b2;

  log_alignment(&b1);
  log_alignment(&b2);
  log_alignment(b_ptr);
  log_alignment(b_arr);  
  log_alignment(b_vec1.data());
  log_alignment(b_vec2.data());
}