#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKCnNpemVfdCBzdDsKc3RydWN0IEF7CiAgIGNoYXIqIGFycjsKICAgQSgpIHsKICAgICAgcHJpbnRmKCIrQSgpICAgWyUrMDNsbGRdXG4iLChzaXplX3QpdGhpcy1zdCk7CiAgICAgIGFycj1uZXcgY2hhclsxMDI0KjEwMjRdOwogICAgICBmb3IgKGludCBpPTA7aTwxMDI0KjEwMjQ7aSsrKQogICAgICAgICBhcnJbaV09aTsKICAgfQogICB+QSgpIHsKICAgICAgcHJpbnRmKCJ+QSgpICAgWyUrMDNsbGRdXG4iLChzaXplX3QpdGhpcy1zdCk7CiAgICAgIGlmIChhcnIpCiAgICAgICAgIGRlbGV0ZVtdIGFycjsKICAgICAgYXJyPW51bGxwdHI7CiAgIH0KICAgdm9pZCBvcGVyYXRvcj0oQSYmIHIpewogICAgICBwcmludGYoIj1BKCYmKSBbJSswM2xsZF0gPSBbJSswM2xsZF1cbiIsKHNpemVfdCl0aGlzLXN0LChzaXplX3QpJnItc3QpOwogICAgICBpZiAoYXJyKQogICAgICAgICBkZWxldGVbXSBhcnI7CiAgICAgIGFycj1yLmFycjsKICAgICAgci5hcnI9bnVsbHB0cjsKICAgfQogICB2b2lkIG9wZXJhdG9yPShBJiByKXsKICAgICAgcHJpbnRmKCI9QSgmKSAgWyUrMDNsbGRdID0gWyUrMDNsbGRdXG4iLChzaXplX3QpdGhpcy1zdCwoc2l6ZV90KSZyLXN0KTsKICAgICAgaWYgKGFycikKICAgICAgICAgZGVsZXRlW10gYXJyOwogICAgICBhcnI9bmV3IGNoYXJbMTAyNCoxMDI0XTsKICAgICAgZm9yIChpbnQgaT0wO2k8MTAyNCoxMDI0O2krKykKICAgICAgICAgYXJyW2ldPXIuYXJyW2ldOwogICB9CiAgIEEoQSYmIHIpewogICAgICBwcmludGYoIitBKCYmKSBbJSswM2xsZF0gKFslKzAzbGxkXSlcbiIsKHNpemVfdCl0aGlzLXN0LChzaXplX3QpJnItc3QpOwogICAgICBhcnI9ci5hcnI7CiAgICAgIHIuYXJyPW51bGxwdHI7CiAgIH0KICAgQShBJiByKXsKICAgICAgcHJpbnRmKCIrQSgmKSAgWyUrMDNsbGRdIChbJSswM2xsZF0pXG4iLChzaXplX3QpdGhpcy1zdCwoc2l6ZV90KSZyLXN0KTsKICAgICAgYXJyPW5ldyBjaGFyWzEwMjQqMTAyNF07CiAgICAgIGZvciAoaW50IGk9MDtpPDEwMjQqMTAyNDtpKyspCiAgICAgICAgIGFycltpXT1yLmFycltpXTsKCiAgIH0KICAgQSBvcGVyYXRvcisoQSYgcikgewogICAgICBBIHRlbXA7CiAgICAgIGZvciAoaW50IGk9MDtpPDEwMjQqMTAyNDtpKyspCiAgICAgICAgIHRlbXAuYXJyW2ldPWFycltpXStyLmFycltpXTsKICAgICAgcHJpbnRmKCIgKygmKSAgWyUrMDNsbGRdID0gWyUrMDNsbGRdK1slKzAzbGxkXVxuIiwoc2l6ZV90KSZ0ZW1wLXN0LChzaXplX3QpdGhpcy1zdCwoc2l6ZV90KSZyLXN0KTsKICAgICAgcmV0dXJuIHRlbXA7CiAgIH0KfTsKCnZvaWQgYWRkKEEmIGEsQSYgYixBJiBjKXsKICAgcHJpbnRmKCJmKygmKSAgWyUrMDNsbGRdID0gWyUrMDNsbGRdK1slKzAzbGxkXVxuIiwoc2l6ZV90KSZhLXN0LChzaXplX3QpJmItc3QsKHNpemVfdCkmYy1zdCk7CiAgIGZvciAoaW50IGk9MDtpPDEwMjQqMTAyNDtpKyspCiAgICAgIGEuYXJyW2ldPWIuYXJyW2ldK2MuYXJyW2ldOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgIGludCByO3N0PShzaXplX3QpJnI7CiAgIHByaW50ZigiXG4gICAgPT0xPT1cbiIpOwogICB7CiAgICAgIEEgYSxiLGM7CiAgICAgIGE9YitjOwogICB9CiAgIHByaW50ZigiXG4gICAgPT0yPT1cbiIpOwogICB7CiAgICAgIEEgYSxiLGM7CiAgICAgIGFkZChhLGIsYyk7CiAgIH0KICAgc3lzdGVtKCJwYXVzZSIpOwogICByZXR1cm4gMDsKfQo=