so true

          心懷未來,開創(chuàng)未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          C++中臨時變量的優(yōu)化與產(chǎn)生!

          #include <iostream>
          using namespace std;

          class A{
          public:
           A(){
            cout<<"ctor"<<endl;
           }
           ~A(){
            cout<<"dtor x="<<x<<endl;
           }
           void operator =(A a){
            cout<<a.x<<" wokao"<<endl;
           }
           int x;
          };

          A func(A a){
           return a;
          }

          void main(){
           A a1;
           a1=func(A());
          }
          輸出結(jié)果:
          ctor
          ctor
          dtor x=-858993460
          -858993460 wokao
          dtor x=-858993460
          dtor x=-858993460
          dtor x=-858993460
          dtor x=-858993460
          Press any key to continue

          ======================================
          為類A添加一個拷貝構(gòu)造函數(shù)后:
          #include <iostream>
          using namespace std;

          class A{
          public:
           A(){
            cout<<"ctor"<<endl;
           }
           A(A& a){
            cout<<"copy ctor"<<endl;
           }
           ~A(){
            cout<<"dtor x="<<x<<endl;
           }
           void operator =(A a){
            cout<<a.x<<" wokao"<<endl;
           }
           int x;
          };

          A func(A a){
           return a;
          }

          void main(){
           A a1;
           a1=func(A());
          }

          運行結(jié)果:
          ctor
          ctor
          copy ctor
          dtor x=4856604
          4856604 wokao
          dtor x=4856604
          dtor x=-858993460
          Press any key to continue

          ==================================
          結(jié)論:
          就像C++ Primer中寫到的一樣,如果你不顯示提供一個copy ctor,那么編譯器使用bitwise copy完成copy ctor功能,由于該操作極為簡便,因此編譯器不會進(jìn)行優(yōu)化,需要的時候就進(jìn)行此操作,因此第一段代碼的運行結(jié)果是調(diào)用了3次copy ctor。
          如果你自己定義了copy ctor,編譯器會認(rèn)為:我的用戶自己定制了copy ctor,八成要做什么復(fù)雜工作吧,每次copy出一個對象來都得費不少事,那么我還是為他/她進(jìn)行優(yōu)化吧。因此第二段代碼僅僅調(diào)用了1次copy ctor。

          P.S.:測試環(huán)境是VC6,如果改用G++編譯器的話,我試驗了一下,結(jié)論就不像前述所說的那樣了,各個編譯器有各自的優(yōu)化策略,總之。

          但VC6里面較好的體現(xiàn)出了Lippman的思想。

          posted on 2008-12-15 22:59 so true 閱讀(491) 評論(0)  編輯  收藏 所屬分類: C&C++

          主站蜘蛛池模板: 叙永县| 濉溪县| 文昌市| 南溪县| 鄂尔多斯市| 德清县| 平塘县| 自贡市| 榕江县| 城固县| 台山市| 东阳市| 甘德县| 乐业县| 连城县| 新和县| 宜宾市| 环江| 中牟县| 海原县| 巢湖市| 乌拉特前旗| 山丹县| 金坛市| 中江县| 安龙县| 图们市| 仪陇县| 临沧市| 靖远县| 安康市| 澎湖县| 桃园县| 石泉县| 项城市| 长岛县| 长治市| 澄城县| 新密市| 尉犁县| 临江市|