#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8eDg2aW50cmluLmg+CgoKY29uc3RleHByIHVuc2lnbmVkIE5OPTEwMjQqMTAyNCo0OwojZGVmaW5lIHRpbWUKI2lmZGVmIHRpbWUKI2RlZmluZSBwcmludChhLi4uKSA7CiNlbHNlCiNkZWZpbmUgcHJpbnQoYS4uLikgcHJpbnRmKGEpCiNlbmRpZgpzaXplX3Qgc3Q7CnN0cnVjdCBBIHsKICAgY2hhciogYXJyOwogICBBKCkgbm9leGNlcHQgewogICAgICBwcmludCgiK0EoKSAgIFslKzAzbGxkXVxuIiwoc2l6ZV90KXRoaXMtc3QpOwogICAgICBhcnI9bmV3IGNoYXJbTk5dOwogICAgICBmb3IgKGludCBpPTA7aTxOTjtpKyspCiAgICAgICAgIGFycltpXT1pOwogICB9CiAgIH5BKCkgbm9leGNlcHQgewogICAgICBwcmludCgifkEoKSAgIFslKzAzbGxkXVxuIiwoc2l6ZV90KXRoaXMtc3QpOwogICAgICBpZiAoYXJyKQogICAgICAgICBkZWxldGVbXSBhcnI7CiAgICAgIGFycj1udWxscHRyOwogICB9CiAgIHZvaWQgb3BlcmF0b3I9KEEmJiByKW5vZXhjZXB0IHsKICAgICAgcHJpbnQoIj1BKCYmKSBbJSswM2xsZF0gPSBbJSswM2xsZF1cbiIsKHNpemVfdCl0aGlzLXN0LChzaXplX3QpJnItc3QpOwogICAgICBpZiAoYXJyKQogICAgICAgICBkZWxldGVbXSBhcnI7CiAgICAgIGFycj1yLmFycjsKICAgICAgci5hcnI9bnVsbHB0cjsKICAgfQogICB2b2lkIG9wZXJhdG9yPShBJiByKW5vZXhjZXB0IHsKICAgICAgcHJpbnQoIj1BKCYpICBbJSswM2xsZF0gPSBbJSswM2xsZF1cbiIsKHNpemVfdCl0aGlzLXN0LChzaXplX3QpJnItc3QpOwogICAgICBpZiAoYXJyKQogICAgICAgICBkZWxldGVbXSBhcnI7CiAgICAgIGFycj1uZXcgY2hhcltOTl07CiAgICAgIGZvciAoaW50IGk9MDtpPE5OO2krKykKICAgICAgICAgYXJyW2ldPXIuYXJyW2ldOwogICB9CiAgIEEoQSYmIHIpbm9leGNlcHQgewogICAgICBwcmludCgiK0EoJiYpIFslKzAzbGxkXSAoWyUrMDNsbGRdKVxuIiwoc2l6ZV90KXRoaXMtc3QsKHNpemVfdCkmci1zdCk7CiAgICAgIGFycj1yLmFycjsKICAgICAgci5hcnI9bnVsbHB0cjsKICAgfQogICBBKEEmIHIpbm9leGNlcHQgewogICAgICBwcmludCgiK0EoJikgIFslKzAzbGxkXSAoWyUrMDNsbGRdKVxuIiwoc2l6ZV90KXRoaXMtc3QsKHNpemVfdCkmci1zdCk7CiAgICAgIGFycj1uZXcgY2hhcltOTl07CiAgICAgIGZvciAoaW50IGk9MDtpPE5OO2krKykKICAgICAgICAgYXJyW2ldPXIuYXJyW2ldOwoKICAgfQogICBBIG9wZXJhdG9yKyhBJiByKW5vZXhjZXB0ICB7CiAgICAgIEEgdGVtcDsKICAgICAgZm9yIChpbnQgaT0wO2k8Tk47aSsrKQogICAgICAgICB0ZW1wLmFycltpXT1hcnJbaV0rci5hcnJbaV07CiAgICAgIHByaW50KCIgKygmKSAgWyUrMDNsbGRdID0gWyUrMDNsbGRdK1slKzAzbGxkXVxuIiwoc2l6ZV90KSZ0ZW1wLXN0LChzaXplX3QpdGhpcy1zdCwoc2l6ZV90KSZyLXN0KTsKICAgICAgcmV0dXJuIHRlbXA7CiAgIH0KICAgdm9pZCBvcGVyYXRvcis9KEEmIHIpbm9leGNlcHQgIHsKICAgICAgZm9yIChpbnQgaT0wO2k8Tk47aSsrKQogICAgICAgIGFycltpXSs9ci5hcnJbaV07CiAgICAgIHByaW50KCIgKz0oJikgWyUrMDNsbGRdICs9IFslKzAzbGxkXVxuIiwoc2l6ZV90KXRoaXMtc3QsKHNpemVfdCkmci1zdCk7CiAgIH0KfTsKCnZvaWQgYWRkKEEmIGEsQSYgYixBJiBjKW5vZXhjZXB0IHsKICAgcHJpbnQoImYrKCYpICBbJSswM2xsZF0gPSBbJSswM2xsZF0rWyUrMDNsbGRdXG4iLChzaXplX3QpJmEtc3QsKHNpemVfdCkmYi1zdCwoc2l6ZV90KSZjLXN0KTsKICAgZm9yIChpbnQgaT0wO2k8Tk47aSsrKQogICAgICBhLmFycltpXT1iLmFycltpXStjLmFycltpXTsKfQoKaW50IG1haW4odm9pZCkgbm9leGNlcHR7CiAgIGludCByO3N0PShzaXplX3QpJnI7CiAgIHNpemVfdCB0MSx0MjsKICAgZm9yIChpbnQgdT0wO3U8Mzt1KyspewogICBwcmludGYoIlxuICAgID09MT09XG4iKTsKICAgdDE9X3JkdHNjKCk7CiAgIHsKICAgICAgQSBhLGIsYzsKICAgICAgYT1iK2M7CiAgIH0KICAgdDI9X3JkdHNjKCk7CiAgIHByaW50ZigiICAgJS4xZlxuIiwodDItdDEpKjEuMGUtNik7CiAgIHByaW50ZigiXG4gICAgPT0yPT1cbiIpOwogICB0MT1fcmR0c2MoKTsKICAgewogICAgICBBIGEsYixjOwogICAgICBhZGQoYSxiLGMpOwogICB9CiAgIHQyPV9yZHRzYygpOwogICBwcmludGYoIiAgICUuMWZcbiIsKHQyLXQxKSoxLjBlLTYpOwogICBwcmludGYoIlxuICAgID09Mz09XG4iKTsKICAgdDE9X3JkdHNjKCk7CiAgIHsKICAgICAgQSBhLGIsYzsKICAgICAgYT1iO2ErPWM7CiAgIH0KICAgdDI9X3JkdHNjKCk7CiAgIHByaW50ZigiICAgJS4xZlxuIiwodDItdDEpKjEuMGUtNik7CiAgIH0KICAgc3lzdGVtKCJwYXVzZSIpOwogICByZXR1cm4gMDsKfQo=