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


size_t st;
struct A{
   char* arr;
   A() {
      printf("+A()   [%+03lld]\n",(size_t)this-st);
      arr=new char[1024*1024];
      for (int i=0;i<1024*1024;i++)
         arr[i]=i;
   }
   ~A() {
      printf("~A()   [%+03lld]\n",(size_t)this-st);
      if (arr)
         delete[] arr;
      arr=nullptr;
   }
   void operator=(A&& r){
      printf("=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){
      printf("=A(&)  [%+03lld] = [%+03lld]\n",(size_t)this-st,(size_t)&r-st);
      if (arr)
         delete[] arr;
      arr=new char[1024*1024];
      for (int i=0;i<1024*1024;i++)
         arr[i]=r.arr[i];
   }
   A(A&& r){
      printf("+A(&&) [%+03lld] ([%+03lld])\n",(size_t)this-st,(size_t)&r-st);
      arr=r.arr;
      r.arr=nullptr;
   }
   A(A& r){
      printf("+A(&)  [%+03lld] ([%+03lld])\n",(size_t)this-st,(size_t)&r-st);
      arr=new char[1024*1024];
      for (int i=0;i<1024*1024;i++)
         arr[i]=r.arr[i];

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

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

int main(void) {
   int r;st=(size_t)&r;
   printf("\n    ==1==\n");
   {
      A a,b,c;
      a=b+c;
   }
   printf("\n    ==2==\n");
   {
      A a,b,c;
      add(a,b,c);
   }
   system("pause");
   return 0;
}
