內聯和動態記憶體分配

2021-08-04 10:32:13 字數 1656 閱讀 3925

•內聯就是用函式已被編譯好的二進位制**,替換對該函式的呼叫指令

–內聯在保證函式特性的同時,避免了函式呼叫的開銷

–內聯通過犧牲**空間,贏得了執行時間

•內聯通常被視為一種編譯優化策略

•若函式在類或結構體的內部直接定義,則該函式被自動優化為內聯函式,謂之隱式內聯

–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...