#include <iostream>

//#include <xmmintrin.h>
typedef float __m128 __attribute__ ((vector_size (16)));


class A {
public:
   long double a;
   __m128 m; 
   long long b;
   A() : a(1.3), b(123) {}
};

char buffer[64];

template <class T>
struct BA {
   char a[sizeof(T)]; 
   bool taken;
   BA* next;
}__attribute__ ((aligned(__alignof(T))));

int main() {
   A* a = new (buffer + 1) A();
#define PRINTT(a) std::cout << #a ": " << a  << std::endl;
   PRINTT((void*)a);
   PRINTT((void*)(buffer + 1));
   PRINTT(sizeof(A));
   PRINTT(__alignof(A));
   if (__alignof(A) > 0) 
      PRINTT(size_t(buffer + 1) % __alignof(A));
   PRINTT(a->a);
   PRINTT(a->b);

   A b = *a;
   PRINTT(b.a);
   PRINTT(b.b);

   a->~A();

  PRINTT(__alignof(char));
  PRINTT(__alignof(int));
  PRINTT(__alignof(int*));
  PRINTT(__alignof(int (A::*)()));
  PRINTT(__alignof(long double));
  PRINTT(__alignof(long long));
  PRINTT(sizeof(BA<A>));
  PRINTT(__alignof(BA<A>));
  PRINTT(offsetof(BA<A>,a));
  PRINTT(offsetof(BA<A>,taken));
  PRINTT(offsetof(BA<A>,next));
}