深入探索C 物件模型 第六章 執行語義學

2021-06-21 23:54:42 字數 1350 閱讀 1818

1.        乙個區段可能有多個return離開點,所以可能導致一些物件建立後,沒有用就需要釋放,這就造成了很多浪費。所以建議把object放置在使用它的區段的附近。

2.        c++中全域性變數會放置在datasegment,如果沒有被指定值,內建型別其所被配置的記憶體內容將會被置為0。(會被初始化),而區域性變數則不會。類型別的話,應該提供乙個預設建構函式,否則就失敗了。

3.        區域性靜態變數的初始化只執行一次,並且析構函式也只執行一次。

4.        物件陣列point arr,如果沒有預設建構函式或者無參建構函式,則陣列定義將會失敗。要對每個物件執行建構函式。函式模型

void *vec_new(void *arr,size_t elem_size,int elem_count,void(*constructor)(void*),void (*destructor)(void*,char))。vec_new 主要做的是將建構函式實施於每個元素中。

5.        使用new運算子時,內建型別int *p=new int(5)需要兩個步驟:1、配置所需的記憶體,2、將配置得來的物件進行賦值。。類型別則需要先申請再進行初始化(呼叫建構函式)。

new 陣列的時候,對於內建型別並不會真的呼叫vec_new(),而類型別則vec_new()函式來呼叫建構函式。

6.        placement  new:特指含有乙個void*(是乙個任意型別的指標)引數的new版本。有兩件事情要做:將物件放到void*指向的位址,呼叫建構函式。返回為乙個指標。

7.        對於基類、子類陣列的問題。如果用基類型別的指標來生成子類,

eg: base *arr=new derived[10];arr陣列中基類和子類的建構函式都要呼叫。但在delete的時候,只呼叫了基類的析構函式。這完全不是好主意。。

8.        對於臨時性物件,許多編譯器會產生臨時性物件進行臨時結果的儲存。而臨時物件的生命規則是需要的時候它應該存在,不需要了應該盡快銷毀。所以就引出了臨時性物件的生命規則的兩個例外:1、表示式用來初始化乙個物件,只有物件的初始化完成了臨時物件(用來儲存表示式結果)才可以被銷毀。2、乙個臨時物件被繫結於乙個reference,物件將殘留,直到reference生命結束才可以,因為他是乙個別名,否則reference沒有意義了。eg:const string &space=」 」,編譯器將會產生以下**:string  temp;temp.string::string(「 」);conststring &space=temp。這個temp就是乙個臨時物件。。但對於內建型別應該就不產生了吧。。

9.        臨時物件的存在,是由於編譯器產生的,可能會使**的效率較低。但通過將個別成員,變數放置在register(暫存器)中、或者通過反聚合方法來提高效率。

深度探索C 物件模型筆記 第六章

c 程式中所有的global objects都被放置在程式的data segment,如果顯示指定給它乙個值,此object將以該值為初值,否則object所配置到的記憶體內容為0 語言要求每次呼叫new都傳回乙個獨一無二的指標,所以如果size等於0返回乙個1 byte的記憶體區塊 point p...

《深度探索C 物件模型》第六章 執行期語意學

new運算子和delete運算子 運算子new看似是乙個簡單的運算,比如 int pi new int 5 但是它實際由兩個步驟完成 1.通過適當的new運算子函式實體,配置所需的記憶體 呼叫函式庫中的new運算子 int pi new sizeof int 2.給配置得到的物件分配初值 pi 5 ...

第六章 深入模板

django內建的模板引擎包含模板上下文 模板變數 標籤,過濾器 模板上下文 模板變數 變數值有檢視函式或檢視類傳遞所得 標籤 對變數進行控制輸出,例如判斷和迴圈控制等 過濾器 多變數進行操作處理。variable1 字串或整型 variable2 variable3 元組或列表 屬性 索引 dja...