深入c 物件模型之執行期語意學

2021-07-28 23:42:17 字數 1345 閱讀 5156

1.物件的構造與解構

一般而言,constructor 和 destructor的安插都會如你所預期:

//c++偽碼

point point;

一般而言會被安插在這裡

一般而言會被安插在這裡 

注意:一般而言我們會將物件放置在使用它的程式附近,這樣做可以節省不必要的物件產生操作和摧毀操作。

1>全域性物件

c++保證全域性物件,一定會在main()函式中第一次用到前,把其構造出來,在main()函式結束前把其摧毀掉。

下圖表示的是cfront的munch構造全域性物件的過程(摘自《深入探索c++物件模型》):

2>區域性靜態物件

只有在建構函式被呼叫時才初始化靜態區域性物件。

3>物件陣列

如果沒有constructor也沒有destructor,那我們只需足夠的記憶體儲存n個連續的物件元素。

4>default constructor和陣列

cfront採用的方法是產生乙個內部的stub constructor ,沒有引數。在其函式內呼叫由程式設計師提供的constructor,並將default 引數明確指定過去。

2.new和delete操作

1>new

int  *pi = new int[5];

由兩步構成:

(1)通過適當的new運算子函式實體,配置所需的記憶體:

//呼叫函式庫中的new運算子

int *pi = _new( sizeof(int));

(2)給配置得來的物件設立初值:

*pi = 5;

更進一步的說,初始化操作要在記憶體配置成功之後再執行。

2>delete

只有在中括號出現時,編譯器才尋找陣列的維度,否則它便假設只有單獨乙個object要被刪除。如果程式設計師沒有提供必要的中括號,那麼就只有第乙個元素被解構,其他的元素仍然存在,雖然相關的記憶體已經被要求歸還。

注意:程式設計師要避免以乙個base class指標指向乙個derived class objects所組成的陣列。(因為base class object 的一般比derived小,在解構的時候會被錯誤的執行,因而不能解構全部記憶體)。

3.臨時物件

1>在某些情況下,由processor產生臨時性物件是有必要的,亦或是比較方便的。這樣的臨時物件由編譯器來定義。

2>臨時性物件被摧毀,應該是對完整表示式求值過程中的最後乙個步驟。該完整表示式造成臨時物件的產生

3>凡含有表示式執行結果的臨時性物件,應該存留到object的初始化操作完成為止。

4>如果乙個臨時性物件被繫結於乙個reference。物件將殘留,知道被初始化之reference的宣告結束,或直到臨時物件的宣告範疇結束------視哪一種情況先到達而定。

深入探索C 物件模型 之 執行期語意學

在 c 中的一件很困難的事,就是不太容易從程式 看出表示式的複雜度。如下面語句 if yy.operator xx.getvalue 將被擴充套件為下面這樣的 c 偽碼 物件的構造和解構 建構函式一般在物件被構造後呼叫,而析構函式必須被放在每乙個離開點 當時 object 還存活 隻前呼叫。一般而言...

深入探索C 物件模型之六 執行期語意學

c 最困難的一點就在於 無法從程式原始碼看出程式表示式的複雜度。因為編譯器會在背後給你做很多的工作。對於一些表示式諸如t a b c,編譯器可能會建立在執行期過程建立臨時物件,那麼在程式的出口處編譯器就需要安插必要的 來保證建立的臨時物件都得到有效的析構。如果遇到goto switch等會產生多個邏...

執行期語意學

物件的構造和析構 講解在以下幾種情況下 編譯器是如何安插構造和析構函式?1.全域性物件 2.區域性靜態物件 3.陣列物件 1 全域性物件 matrix g identity main c 保證了在main函式中第一次用到g str之前,將g str構造出來,在main 函式結束之前將g str毀掉。...