轉:Inside the C++ Object Model學習筆記[Chap4.3-4.4]

來源:互聯網
上載者:User
 

4.3 指向成員函數的指標取一個非待用資料成員的地址,得到的是該成員在類布局中的位移量(未最佳化時還需要加1),它需要被綁定到某個類對象的地址上才可以存取;而取一個非靜態成員函數的地址,若為非虛函數,那麼得到的是在記憶體中的真正地址,但也需要被綁定到某個類對象的地址上,才能夠通過它調用該函數,對於所有的非靜態成員函數都需要對象的地址,即參數this指標。如果取一個虛函數地址,那麼其在編譯期間是未知的,所能知道的只是虛函數在其相關的vtbl中的索引值。一個指向成員函數的指標聲明文法為:double ( Point::*pmf ) ();定義並初始化該指標:double ( Point::*coord ) () = &Point::x;或者賦值操作:coord = &Point::y;調用方式如下:( origin.*coord ) (); 或者 ( ptr->*coord ) ();使用成員函數指標,如果不用於虛函數,多重繼承與虛擬繼承等情況,並不會比使用非成員函數指標的成本更高,但用於那三種情況時,其複雜度增加很多。 4.3.1指向虛擬成員函數的指標指標調用虛函數所達到的多態行為,通過指向虛擬成員函數的指標也可以做到同樣的效果,如:class Point {       public:              virtual ~Point();              float x();              float y();              virtual float z();};float ( Point::*pmf ) () = & Point::z;Point *ptr = new Point3D;通過pmf來調用z():( ptr-.*pmf() );其內部轉換為(偽碼):( * ptr->vptr[ (int) pmf ]) ( ptr ); 4.3.2【未】多重繼承下指向成員函數的指標  4.3.3指向成員函數指標的效率作者所作的測試條件:1. 指向非成員函數的指標;2. 指向類成員函數的指標;3. 指向虛成員函數的指標;4. 多重繼承下的非虛以及虛擬成員函數指標;5. 虛擬繼承下的非虛以及虛擬成員函數指標。 4.4 內嵌函式一般處理一個inline函數分為兩個階段:1. 分析函數定義,以決定函數與編譯器相關的內聯能力:如果函數太複雜,或者因為建構問題(比如分配記憶體,取地址等操作),被判斷為不可內聯,那麼它會被轉換為一個static函數,並在被編譯模組內產生對應的函數定義;2. 真正的inline函數擴充操作是在調用的那一點上,這樣會帶來參數的求值操作以及臨時性對象的管理等問題。 4.4.1形式參數Inline函數在擴充期間,每一個形式參數都會被對應的實際參數取代,並且為了防止對實際參數的多次求值所引起的副作用,會引入臨時性對象。如果實際參數時一個常量運算式,在替換之前先完成其求值操作,後繼的內聯替換,就可以把常量直接綁上去,如果既不是常量運算式,又不是帶有副作用的運算式,那麼就直接替換,如:inline int min( int ival, int jval ) {       return ival < jval ? ival : jval;}對其叫用作業如下:inline int bar() {       int minval;       int val1 = 1024;       int val2 = 2048;       minval = min( val1, val2 );         //--------①       minval = min( 1024, 2048 );        //--------②       minval = min( foo(), bar() + 1 );     //--------③       return minval;}標識①採用實際參數直接替換:minval = val1 < val2 ? val1 : val2;標識②採用直接常量結果:minval = 1024;標識③匯入臨時性對象避免重複求值:int t1;int t2;minval = ( t1 = foo()), ( t2 = bar() + 1 ), t1 < t2 ? t1 : t2; 4.4.2局部變數一般而言,inline函數中的每一個局部變數都必須被放在函數調用的一個封閉區段中,擁有一個獨一無二的名稱。如果inline函數以單一運算式擴充多次,那麼每次擴充都需要自己的一組局部變數,如果inline函數以分離的多個式子被擴充多次,那麼只需一組局部變數,就可以重複使用。內嵌函式中的局部變數,再加上有副作用的參數,可能會導致大量臨時性對象的產生。

說明:參數帶有副作用,或是以一個單一運算式做多重調用,或是再inline函數中有多個局部變數,都會產生臨時性對象

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.