各類編譯器 allocator 底層

2022-01-31 09:15:58 字數 2158 閱讀 4838

我們在c++中建立陣列通常使用new來分配我們需要的記憶體大小,之後通過delete進行釋放記憶體

但是我們呼叫new的時候,通過呼叫的是operator new,二operator new呼叫的是malloc,所以我們說new的本質其實就是malloc,只不過我們看不到而已,同樣,delete呼叫operator delete ,進而呼叫free

我們通常會告訴編譯器我們需要多大的記憶體空間,也就是傳乙個size引數,但是編譯器所開闢的空間就不知size那麼大了,他開闢的空間比size的,如上圖,我們malloc size的大小,但是編譯器確為我們開闢上面那麼多的記憶體空間,這樣反應了乙個問題,如果我們的ssize很小,那麼額外空間所佔的比例就大,如果我們開闢的空間小,那麼額外空間所佔的比例就小,我們在這裡不能說額外空間有多浪費,或者具體有多大,我們只能研究他所佔的比例相對於一次malloc所有的記憶體占得大小而已,這額外空間中,有兩個是必須就是上圖邊界的兩個紫色部分,這叫做cookie,最上面的cookie裡面存著整個空間的大小,方便我們delete的時候,我們直接通過首位址釋放cookie裡面存的大小記憶體就可以了,提高效率

上面大家可以看到各種容器使用的也都是allocator,這個源**是vc,bc通用的(大致相同),allocator的原理和new是一樣的,也是呼叫operator new,進而呼叫malloc,相同,deallocator 呼叫的是operator delete,進而呼叫free

同時,因為我們看到了源**,所以我們可以手動使用分配器

int *p=allocaort()._allocator(10,(int *)0);

allocaort().deallocator(p,10);

allocaort()的意思就是乙個物件allocator制定了模板類,加上()其實就變成了乙個臨時的object

上面大家可以看到在gcc2.9編譯器中,預設使用的分配器不是allocator,而是alloc,why?

實際上在gcc2.9中allocator仍然還是存在的,只不過編譯器不用,使用alloc,當時認為alloccator過於浪費,因為每次malloc需要分配記憶體的時候,分配的記憶體都有很多的額外的記憶體開銷,所以,alloc產生了,alloc的結構如下,他有16個連續·的鍊錶,每乙個指向一段記憶體空間,第乙個指向8個位元組的,第二個指向16個位元組,依次類推,分別增加8個,當編譯器malloc的時候,加入需要50個。他會找到底7個位置,開闢56個記憶體,這樣的話就不必要那麼多額外的空間消費,,,,,,,,但是到gcc4.9又開始預設使用allocator,

gcc4.9又開始使用allocator但是變了,源**中allocator繼承了alloccator base,但是define巨集定義發現,他是newallocator,內部又是allocator,之後operator new, 進而malloc,本質還是malloc,但是alloc並沒有刪除,他被應用到了一些其他的分配器中,比如最後一張圖,他被分配到了——poll allocator之中

gcc在編譯器的各類用途

二 gcc編譯工具的各類用途 三 程式背後的優秀 庫 四 總結與參考資料 1 將one.c檔案編譯為one.o檔案 2 將two.c檔案編譯為two.o檔案 3 將main.c檔案編譯為main.o檔案 執行ls命令,產生了.o檔案,表明編譯完成 ar crv libzxw.a one.o two....

32 64位編譯器各型別大小和位元組對齊

32位編譯器 32位系統下指標占用4位元組 char 1個位元組 char 即指標變數 4個位元組 32位的定址空間是2 32,即32個bit,也就是4個位元組。同理64位編譯器 shortint 2個位元組 int 4個位元組 unsigned int 4個位元組 float 4個位元組 doub...

編譯方舟編譯器

環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...