#include <stdio.h>
#include <stdlib.h>
#include <iterator>
#include <x86intrin.h>


constexpr unsigned NN=1024*1024*4;
#define time
#ifdef time
#define print(a...) ;
#else
#define print(a...) printf(a)
#endif
size_t st;
struct A {
   char* arr;
   A() noexcept {
      print("+A()   [%+03lld]\n",(size_t)this-st);
      arr=new char[NN];
      for (int i=0;i<NN;i++)
         arr[i]=i;
   }
   ~A() noexcept {
      print("~A()   [%+03lld]\n",(size_t)this-st);
      if (arr)
         delete[] arr;
      arr=nullptr;
   }
   void operator=(A&& r)noexcept {
      print("=A(&&) [%+03lld] = [%+03lld]\n",(size_t)this-st,(size_t)&r-st);
      if (arr)
         delete[] arr;
      arr=r.arr;
      r.arr=nullptr;
   }
   void operator=(A& r)noexcept {
      print("=A(&)  [%+03lld] = [%+03lld]\n",(size_t)this-st,(size_t)&r-st);
      if (arr)
         delete[] arr;
      arr=new char[NN];
      for (int i=0;i<NN;i++)
         arr[i]=r.arr[i];
   }
   A(A&& r)noexcept {
      print("+A(&&) [%+03lld] ([%+03lld])\n",(size_t)this-st,(size_t)&r-st);
      arr=r.arr;
      r.arr=nullptr;
   }
   A(A& r)noexcept {
      print("+A(&)  [%+03lld] ([%+03lld])\n",(size_t)this-st,(size_t)&r-st);
      arr=new char[NN];
      for (int i=0;i<NN;i++)
         arr[i]=r.arr[i];

   }
   A operator+(A& r)noexcept  {
      A temp;
      for (int i=0;i<NN;i++)
         temp.arr[i]=arr[i]+r.arr[i];
      print(" +(&)  [%+03lld] = [%+03lld]+[%+03lld]\n",(size_t)&temp-st,(size_t)this-st,(size_t)&r-st);
      return temp;
   }
   void operator+=(A& r)noexcept  {
      for (int i=0;i<NN;i++)
        arr[i]+=r.arr[i];
      print(" +=(&) [%+03lld] += [%+03lld]\n",(size_t)this-st,(size_t)&r-st);
   }
};

void add(A& a,A& b,A& c)noexcept {
   print("f+(&)  [%+03lld] = [%+03lld]+[%+03lld]\n",(size_t)&a-st,(size_t)&b-st,(size_t)&c-st);
   for (int i=0;i<NN;i++)
      a.arr[i]=b.arr[i]+c.arr[i];
}

int main(void) noexcept{
   int r;st=(size_t)&r;
   size_t t1,t2;
   for (int u=0;u<3;u++){
   printf("\n    ==1==\n");
   t1=_rdtsc();
   {
      A a,b,c;
      a=b+c;
   }
   t2=_rdtsc();
   printf("   %.1f\n",(t2-t1)*1.0e-6);
   printf("\n    ==2==\n");
   t1=_rdtsc();
   {
      A a,b,c;
      add(a,b,c);
   }
   t2=_rdtsc();
   printf("   %.1f\n",(t2-t1)*1.0e-6);
   printf("\n    ==3==\n");
   t1=_rdtsc();
   {
      A a,b,c;
      a=b;a+=c;
   }
   t2=_rdtsc();
   printf("   %.1f\n",(t2-t1)*1.0e-6);
   }
   system("pause");
   return 0;
}
