程式轉化語義
程式優化
成員初始化列表
必須成員初始化列表使用場景
類物件模型
位元組對齊建構函式語義1.位元組對齊是什麼?
由於cpu訪問記憶體的位址特性,乙個變數如果不對齊,可能會觸發更多次cpu訪問記憶體的操作。
2. 記憶體對齊的規則
有效對齊數= min(自身對齊數,最大位元組)
自身對齊數:32位系統為4,64位系統為8
我們常常認為,當我們沒有定義預設建構函式的時候,系統會為我們合成乙個預設建構函式。其實只有在必要的時候,編譯器才會為我們生成預設的建構函式。
類型別成員
類中包含類型別的物件成員,且該成員具有預設的建構函式,編譯器會為該類生成乙個合成預設建構函式,作呼叫類中的類型別成員之用。
父類具有乙個父類,父類具有預設的建構函式,編譯器會生成合成預設建構函式,安插相關的**,呼叫父類的建構函式。
虛函式具有虛函式。編譯器安插**:
這時候因為有虛函式的存在,編譯器為我們生成乙個基於該類的虛函式表vftable,並為虛函式表指標賦值。
虛基類虛基類的情況存在於三層結構:乙個grand派生出兩個parent類,在子類中同時繼承這兩個parent類。這時候由於grand在子類中存在衝突,因為需要把grand宣告為乙個虛基類的情況。
這種情況下,我們的編譯器產生合成建構函式來生成虛基類表vbtable.
拷貝建構函式語義
在普通的場景下,不寫拷貝建構函式的時候,編譯器會有內部的直接拷貝資料的手法(bitwise),將類中的普通變數,類的類變數的每個成員變數,此時編譯器並沒有為我們生成拷貝建構函式。
那麼在什麼場景下編譯器會為我們生成拷貝建構函式呢?
1.類中具有類型別的變數,且該類變數具有拷貝建構函式。這時候會生成拷貝建構函式完成額外的工作–>呼叫類變數中的拷貝建構函式。
2.父類具有拷貝建構函式。
3.具有虛函式。生成拷貝構造來設定虛函式表指標。
4.虛基類
程式轉化語義
在編譯器解析的角度來講,我們的**是如何解析的。
定義時初始化物件
class
aint m;
}a a0;
a a0.m =1;
a a1 = a0;
a a2
(a0)
;a a3 = a1;
在定義時初始化這件事情上,編譯器是不會呼叫建構函式的,直接呼叫拷貝建構函式完成物件的構建。
類型別的函式引數
函式形參上直接呼叫拷貝構造建構函式形參。
函式返回值初始化
系統產生乙個臨時物件作為返回值,且返回值是直接拷貝構造在被初始化的值上的。
編譯器角度上這點是如何做的呢?相當於返回值作為乙個物件的引用傳入,而傳入的物件呼叫拷貝建構函式。
a func()
a a =
func()
;//編譯器的做法
void func(a& extra)
程式優化
開發層面的優化
節省乙個拷貝構造和析構函式
ctemp double()
編譯器層面的優化
上述**方式1中,經過編譯器優化之後,實際上並不會構造臨時物件。而自動被編譯器優化成方式2的構造方式,這種方式被稱為 rvo(return value optimization)優化;
成員初始化列表
必須成員初始化列表使用場景
類成員變數需要定義的時候初始化的型別:引用型別,const變數。
帶參建構函式的類型別,可以是基類,也可以使類型別成員。
成員初始化列表的特點
1.成員初始化列表屬於編譯過程中編譯器往建構函式體之前插入的片段,對於類型別的成員變數,相對於建構函式體中賦值,成員初始化列表可以使類型別成員變數在構造的時候初始化,避免建構函式和拷貝賦值運算子呼叫從而提高效率。
2.成員初始化列表中的初始化順序,取決於在類中的定義順序,當使用乙個變數初始化另乙個變數的時候,更應考慮到這一點。
c 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...