• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            高山流水

            ----- 要黑就黑徹底

            Inside The C++ Object Model 學習筆記--The Semantics of Function

            Chapter 4.? The Semantics of Function: Function 語意學

            4.1 Member 函數的各種調用方式
            1. Nonstatic Member Function(非靜態(tài)成員函數)
            ??? 要做如下的轉換:
            ??? (1) 改寫函數的原形, 安插一個參數到member function中, 用于提供一個存取管道, 使class object 得以調用該函數, 這個額外的指針稱之為: this指針.
            ??? 如:??
            ?Point3d::magnitude()? 會轉換為:? Point3d::magnitude(Point3d *const? this)

            ??? (2)? 對函數內每一個針對nostatic data member的存取操作改經由this指針來存取.
            ???? 如:
            ?????????? return sqrt(
            ??this->_x? *? this->_x? + this->y * this->_y? + this->_z * this->_z;
            ??? (3)? 將對member function 重寫一個外部函數, 對函數名稱進行"mangling"處理, 使它生成一個獨一無二的名稱
            ???
            2. Virtual Member Function(虛擬成員函數)
            ???? 例如:
            ? ptr->normalize();
            ? 它將被轉化為如下的調用:
            ?( * ptr->vptr[ 1 ])( ptr );
            ?這里有幾點說明: 
            ?i.? vptr是由編譯器生成的指針,指向virtual table
            ?ii.? 1 這里是virtual table slot 的索引值,它關聯(lián)到nomalize這個函數
            ?iii.? 第二個ptr表示this指針

            3. Static Member Function(靜態(tài)成員函數)
            ???? 如果Point3d::normalize()是一個static member function的話,這兩個調用會轉化為一般的操作:
            ???? obj.normalize();
            ???? ptr->normalize();
            ???? 轉化為: 
            ???? // obj.normalize();
            ???? normalize__7Point3dSFv();
            ???? // ptr->normalize();
            ???? normalize__7Point3dSfv();

            4.2 Virtual Member Functions(虛擬成員函數)
            1. 單一繼承下的Virtual Functions
            ???? 一個多態(tài)的class object 身上增加兩個members:
            ?I.?? 一個字符串或數字,? 表示class的類型
            ?II.? 一個指針,指向某個表格,表格中帶有程序的virtual function的執(zhí)行時期地址
            ??? 對于一個active virtual function包括下面三個內容: 
            ??????? I.?? 這個class 所定義的函數實體, 它會改寫一個可能存在的base class virtual function 函數實體.
            ?II.? 繼承自基類的實體, 這是在derived class 決定不改寫virtual function 時才會出現的情況
            ?III. 一個pure_virtual_called()函數實體,它既可以扮演pur virtual function的空間保衛(wèi)者角色, 也可以當做執(zhí)行期異常函數.

            2. 多重繼承下的Virtual Functions
            ??? 這種繼承涉及到要調整this指針,并且要求不止一個vtbl和vptr,同時要好幾個這種虛表和指針

            3. 虛擬繼承下的Virtual Functions


            4.3 函數的效能

            4.4 指向Member Functions的指針(Pointer-to-Member Functions)
            1. 指向一般成員函數的指針(Nostatic member and novirtual member function)
            ??? 取一個nostatic member function的地址,? 如果該函數是novirtual, 則得到的結果是它在內存中真正的地址, 然而這個地址也不是完全的, 它也需要綁定到某個class object的地址上, 才能夠調用該函數. 所有的nostatic member functions都要對象的地址(用this指出).
            ??? 例如:
            ???? double (Point::*pmf)();?// 定義一個成員函數指針
            ????? pfm = &Point::y;???// 初始化這個指針為
            ???? (ptr->*pfm)() ;???// 調用為,? 編譯器轉化為: (pfm)(ptr)

            2. 支持"指向Virtual Member Functions"的指針
            ??? 對于virtual function, 其地址在編譯時期是未知的, 所能知道的僅是virtual function在相關的vitual table 中的索引值. 也就是說對于一個virtual member function取其地址, 所能獲得的只是一個索引值.
            ??? 所以如果:
            ??? pmf = &Point::z();?// 獲得的是索引值,? 調用時:
            ??? (ptr.->pmf)()???// 會轉化為: (* ptr->vptr[(int)pfm] (ptr)

            3. 在多重繼承下,指向Member Functions的指針
            ???? 比較復雜,? 定義了一個結構支持這們的操作

            4. 指向 Member Functions 指針的效率


            4.4 Inline Functions
            1. inline functions的生成條件

            2. 對形式參數的處理(Formal Arguments)
            例如:

            ?1?inline?int?min(?int?i,?int?j?)?
            ?2??{?
            ?3?????return?i?<?j???i?:?j;?
            ?4??}?
            ?5??and?the?following?three?invocations?of?the?inline?function:
            ?6?
            ?7??inline?int?bar()?
            ?8??{?
            ?9?????int?minval;?
            10?????int?val1?=?1024;?
            11?????int?val2?=?2048;?
            12?
            13??/*(1)*/minval?=?min(?val1,?val2?);?
            14??/*(2)*/minval?=?min(?1024,?2048?);?
            15??/*(3)*/minval?=?min(?foo(),?bar()+1?);?
            16?
            17?????return?minval;?
            18??}?

            ?
            用下面的方式進行處理:
            ?? (1)? 直接的參數替換
            ?//(1)???? simple argument substitution
            ?minval = val1 < val2 ? val1 : val2;

            ?? (2) 如果實際參數是一個常量表達式(const expression),? 我們就可以在替換前完成對它的求值操作.
            ?//(2)? constant folding following substitution
            ?minval = 1024;
            ??
            ?? (3) 帶有副作用的實際參數, 引入臨時性的對象
            ?//(3)???? side-effects and introduction of temporary
            ?int t1;
            ?int t2;

            ?minval =? ( t1 = foo() ), ( t2 = bar() + 1 ),? t1 < t2 ? t1 : t2;

            3. 對inline函數帶有局部變量的處理(Local Variables)
            ??? 如:
            ?inline int min( int i, int j )
            ?{
            ??int minval = i < j ? i : j;
            ??return minval;
            ?}
            ??? 對于如下的調用:
            ??? {
            ??? int local_var;
            ??? int minval;

            ??? // ...
            ??? minval = min( val1, val2 );
            ???? }

            ??? 轉換可能的結果是:

            1?????{?
            2?????int?local_var;?
            3?????int?minval;?
            4?????//?mangled?inline?local?variable?
            5?????int?__min_lv_minval;?
            6?
            7?????minval?=??(?__min_lv_minval?=??val1?<?val2???val1?:?val2?),??__min_lv_minval;?
            8??????}

            ?

            posted on 2006-10-30 14:39 猩猩 閱讀(306) 評論(0)  編輯 收藏 引用 所屬分類: C&C++語言

            青青青青久久精品国产h久久精品五福影院1421| 亚洲人成无码www久久久| 99久久精品国产一区二区| 亚洲色大成网站WWW久久九九| 亚洲欧美日韩久久精品第一区| 久久亚洲国产成人影院| 久久精品国产一区| 午夜人妻久久久久久久久| 久久久久亚洲AV无码专区网站| 久久久精品国产免大香伊| 日本久久久久久中文字幕| 99久久超碰中文字幕伊人| 亚洲中文久久精品无码ww16| 品成人欧美大片久久国产欧美...| 亚洲中文字幕无码久久精品1 | 国产99精品久久| 青草国产精品久久久久久| 午夜天堂av天堂久久久| 狠狠久久亚洲欧美专区| 久久久久久国产精品免费免费| 久久婷婷午色综合夜啪| 久久久高清免费视频| 亚洲国产精品无码久久| 久久精品a亚洲国产v高清不卡| 久久综合狠狠综合久久| 亚洲国产精久久久久久久| 欧美牲交A欧牲交aⅴ久久| 色综合久久夜色精品国产| 亚洲精品乱码久久久久久久久久久久| 思思久久99热只有频精品66| 久久精品人人槡人妻人人玩AV| 久久国产精品99国产精| 久久精品国产一区二区三区不卡| 亚洲成av人片不卡无码久久| AV无码久久久久不卡蜜桃| 午夜福利91久久福利| 久久激情五月丁香伊人| 94久久国产乱子伦精品免费| 中文精品久久久久人妻不卡| 91精品国产高清久久久久久国产嫩草| 亚洲AV无码1区2区久久|