bosthhe1 / cpushpush

0 stars 0 forks source link

关于编译器优化拷贝构造的浅理解 #8

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

题:下方一共用到了几次拷贝构造函数 image

bosthhe1 commented 1 year ago

如果没有编译器优化,那我们按照流程:进入main函数,初始化d没有拷贝构造函数,然后执行下面的语句,先执行最里面的 f(d) ,f(d)传参到函数调用拷贝构造一次,然后下面的DATE d1(d),DATE d2 = d1;调用两次,return返回值传递,拷贝一次,一次函数调用就需要拷贝4次,两次函数调用就需要拷贝8次,函数调用完成后要赋值给d3,又会调用一次拷贝构造,一共就是9次,但是我们在拷贝构造函数加入显示信息看到只调用了7次拷贝构造 image

bosthhe1 commented 1 year ago

为什么只显示7次,是因为编译器在处理的过程中做了优化,在我们第一次拷贝构造结束的时候,return产生了拷贝构造赋给外面的f(),外面的f()又会去调用拷贝构造传参给f函数,这样的话相当于做了两次一样的事情,产生了一样的结果,所以编译器会做出优化,将这两步转化为一步,拷贝构造传给外面的f(),f()调用函数的时候就直接把传过来的临时变量传过去了,没有参数拷贝构造,所以这里优化了一次,第二次优化就是在第二次函数调用结束,return返回产生零时变量直接赋值给了d3,跳过了赋值的拷贝构造,因为走一步和走两步效果一样,所以编译器进行了优化