1. 程式人生 > >今日刷題總結21

今日刷題總結21

delete 磁盤 和數 最新版 常量存儲區 全局 nbsp 獲取 如果

C++的內存分配方式

之前有說過C++的內存分為5部分,即棧、堆、全局/靜態存儲區、自由存儲區以及常量存儲區。

棧:棧由編譯器自動分配與釋放,它用來存儲函數的參數值以及局部變量。

堆:堆由應用程序分配與釋放,應用程序使用malloc在堆上獲取內存,使用free釋放內存。如果應用程序獲取內存後沒有釋放,就會造成內存泄漏,在應用程序終止時泄漏的內存才會被操作系統回收。

自由存儲區:自由存儲區是C++中基於new和delete的抽象概念。當應用程序使用new分配內存時,就說該內存是自由存儲區。C++編譯器基本上使用malloc來實現operator new,所以使用new分配的內存既可以說是在堆上也可以說是在自由存儲區。但是operator new允許被重載,應用程序可以將operator new實現為在其他內存區域(比如靜態存儲區)上獲取內存,這時自由存儲區和堆就不是一個概念。

全局/靜態存儲區:全局和靜態變量是存放在一塊的,在C中,初始化的全局/靜態變量存放在進程的data區內,未初始化的全局/靜態變量存放在bss區。在C++中不做這樣的區分。

常量存儲區:這是一塊比較特殊的存儲區,他們裏面存放的是常量,不允許修改。

靜態鏈接庫和動態鏈接庫(unix)

在UNIX系統中,靜態鏈接庫以一種稱為存檔(archive)的文件格式存放在磁盤上。存檔文件是一組連接起來的可重定位目標文件的集合,可重定位目標文件可由相關函數編譯而成,有一個頭部用來描述每個成員文件的大小和位置。存檔文件名由後綴.a標識。靜態鏈接庫的鏈接是在編譯時期完成的,鏈接時鏈接器只拷貝被程序引用的目標文件。

靜態鏈接庫存在2個缺點:

1)需要定期維護和更新,程序使用最新版本的庫時需要顯式地與其鏈接。

2)對於那些常用的庫函數,在運行時,都會被拷貝到每個運行進程的文本段中,對內存造成了極大地浪費。

為此提出動態鏈接庫的概念,它是一個目標文件,在運行時可以和內存中的進程鏈接,該過程由動態連接器完成,在unix中其後綴名為.so。所有引用動態鏈接庫的進程共享庫中的代碼和數據,而被引用靜態鏈接庫會被拷貝到每個進程的可執行文件中。同時,一個動態鏈接庫的文本段的一個副本可以被不同正在運行的進程共享。

今日刷題總結21