•內聯就是用函式已被編譯好的二進位制**,替換對該函式的呼叫指令
–內聯在保證函式特性的同時,避免了函式呼叫的開銷
–內聯通過犧牲**空間,贏得了執行時間
•內聯通常被視為一種編譯優化策略
•若函式在類或結構體的內部直接定義,則該函式被自動優化為內聯函式,謂之隱式內聯
–struct user };
•若在函式定義前面,加上inline關鍵字,可以顯式告訴編譯器,該函式被希望優化為內聯函式,這叫顯式內聯
–inline void foo (void)
•內聯會使可執行檔案的體積和程序**的記憶體變大,因此只有頻繁呼叫的簡單函式才適合內聯
•稀少被呼叫的複雜函式,呼叫開銷遠小於執行開銷,由內聯而獲得的時間效能的改善,不足以抵消空間效能的損失,故不適合內聯
•inline關鍵字僅僅表示一種對函式實施內聯優化的期望,但該函式是否真的會被處理為內聯,還要由編譯器的優化策略決定
•帶有遞迴呼叫或動態繫結特性的函式,無法實施內聯,編譯器會忽略其宣告部分的inline關鍵字
•c++提供了new和delete操作符,分別用於動態記憶體的分配和釋放
–int* p = new int; delete p;
•c++的new操作符允許在動態分配記憶體時對其做初始化
–int* p = new int;
–int* p = new int ();
–int* p = new int (100);
•以陣列方式new的也要以陣列方式delete
–int* p = new int[4] ; delete p;
•某些c++實現,用new操作符動態分配陣列時,會在陣列首元素前面多分配4或8個位元組,用以存放陣列的長度
•new操作符所返回的位址是陣列首元素的位址,而非所分配記憶體的起始位址
•如果將new操作符返回的位址直接交給delete操作符,將導致無效指標(invalidate pointer)異常
•delete操作符會將交給它的位址向低位址方向偏移4或8個位元組,避免了無效指標異常的發生
•不能通過delete操作符釋放已釋放過的記憶體
–int* p = new int; delete p; delete p; // 核心轉儲
–標準庫檢測到重析構(double free)異常後將程序殺死,並轉儲程序映像
•delete野指標後果未定義,delete空指標安全
–int* p = new int; delete p; p = null; delete p; // 什麼也不做
•記憶體分配失敗,new操作符丟擲bad_alloc異常
–char* p = (char*)malloc (0xffffffff);
if (p == null)
–try
catch (bad_alloc& ex)
{ cerr
<< "記憶體分配失敗!"
<< endl;
exit (-1);
靜態記憶體分配和 動態記憶體分配
1 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源 動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源 2 靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的 3 動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要 4 靜態分配記憶體需要在編譯前確定記憶...
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...
動態記憶體分配
為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...