欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c語(yǔ)言?xún)?nèi)存占取函數(shù) c語(yǔ)言所占內(nèi)存空間大小怎么輸出

C語(yǔ)言中分配內(nèi)存的函數(shù)是怎么寫(xiě)的?

Windows下的 malloc 原理就是調(diào)用 windows API 的各種內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存并記錄內(nèi)存狀態(tài)以便將來(lái)釋放。

十余年建站經(jīng)驗(yàn), 成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)客戶(hù)的見(jiàn)證與正確選擇。成都創(chuàng)新互聯(lián)公司提供完善的營(yíng)銷(xiāo)型網(wǎng)頁(yè)建站明細(xì)報(bào)價(jià)表。后期開(kāi)發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

DOS下的 malloc 原理就是調(diào)用申請(qǐng)內(nèi)存的中斷申請(qǐng)內(nèi)存并記錄內(nèi)存狀態(tài)以便將來(lái)釋放。

UNIX 和 Linux 都有內(nèi)存管理的系統(tǒng)調(diào)用,malloc 相當(dāng)于給這些系統(tǒng)調(diào)用穿了一件

malloc()工作機(jī)制

malloc函數(shù)的實(shí)質(zhì)體現(xiàn)在,它有一個(gè)將可用的內(nèi)存塊連接為一個(gè)長(zhǎng)長(zhǎng)的列表的所謂空閑鏈表。調(diào)用malloc函數(shù)時(shí),它沿連接表尋找一個(gè)大到足以滿(mǎn)足用戶(hù)請(qǐng)求所需要的內(nèi)存塊。然后,將該內(nèi)存塊一分為二(一塊的大小與用戶(hù)請(qǐng)求的大小相等,另一塊的大小就是剩下的字節(jié))。接下來(lái),將分配給用戶(hù)的那塊內(nèi)存?zhèn)鹘o用戶(hù),并將剩下的那塊(如果有的話(huà))返回到連接表上。調(diào)用free函數(shù)時(shí),它將用戶(hù)釋放的內(nèi)存塊連接到空閑鏈上。到最后,空閑鏈會(huì)被切成很多的小內(nèi)存片段,如果這時(shí)用戶(hù)申請(qǐng)一個(gè)大的內(nèi)存片段,那么空閑鏈上可能沒(méi)有可以滿(mǎn)足用戶(hù)要求的片段了。于是,malloc函數(shù)請(qǐng)求延時(shí),并開(kāi)始在空閑鏈上翻箱倒柜地檢查各內(nèi)存片段,對(duì)它們進(jìn)行整理,將相鄰的小空閑塊合并成較大的內(nèi)存塊。

malloc()在操作系統(tǒng)中的實(shí)現(xiàn)

在 C 程序中,多次使用malloc () 和 free()。不過(guò),您可能沒(méi)有用一些時(shí)間去思考它們?cè)谀牟僮飨到y(tǒng)中是如何實(shí)現(xiàn)的。本節(jié)將向您展示 malloc 和 free 的一個(gè)最簡(jiǎn)化實(shí)現(xiàn)的代碼,來(lái)幫助說(shuō)明管理內(nèi)存時(shí)都涉及到了哪些事情。

在大部分操作系統(tǒng)中,內(nèi)存分配由以下兩個(gè)簡(jiǎn)單的函數(shù)來(lái)處理:

void *malloc (long numbytes):該函數(shù)負(fù)責(zé)分配 numbytes 大小的內(nèi)存,并返回指向第一個(gè)字節(jié)的指針。

void free(void *firstbyte):如果給定一個(gè)由先前的 malloc 返回的指針,那么該函數(shù)會(huì)將分配的空間歸還給進(jìn)程的“空閑空間”。

malloc_init 將是初始化內(nèi)存分配程序的函數(shù)。它要完成以下三件事:將分配程序標(biāo)識(shí)為已經(jīng)初始化,找到系統(tǒng)中最后一個(gè)有效內(nèi)存地址,然后建立起指向我們管理的內(nèi)存的指針。這三個(gè)變量都是全局變量:

//清單 1. 我們的簡(jiǎn)單分配程序的全局變量

int has_initialized = 0;

void *managed_memory_start;

void *last_valid_address;

如前所述,被映射的內(nèi)存的邊界(最后一個(gè)有效地址)常被稱(chēng)為系統(tǒng)中斷點(diǎn)或者 當(dāng)前中斷點(diǎn)。在很多 UNIX? 系統(tǒng)中,為了指出當(dāng)前系統(tǒng)中斷點(diǎn),必須使用 sbrk(0) 函數(shù)。 sbrk 根據(jù)參數(shù)中給出的字節(jié)數(shù)移動(dòng)當(dāng)前系統(tǒng)中斷點(diǎn),然后返回新的系統(tǒng)中斷點(diǎn)。使用參數(shù) 0 只是返回當(dāng)前中斷點(diǎn)。這里是我們的 malloc 初始化代碼,它將找到當(dāng)前中斷點(diǎn)并初始化我們的變量:

清單 2. 分配程序初始化函數(shù)

#include

void malloc_init()

{

last_valid_address = sbrk(0);

managed_memory_start = last_valid_address;

has_initialized = 1;

}

現(xiàn)在,為了完全地管理內(nèi)存,我們需要能夠追蹤要分配和回收哪些內(nèi)存。在對(duì)內(nèi)存塊進(jìn)行了 free 調(diào)用之后,我們需要做的是諸如將它們標(biāo)記為未被使用的等事情,并且,在調(diào)用 malloc 時(shí),我們要能夠定位未被使用的內(nèi)存塊。因此, malloc 返回的每塊內(nèi)存的起始處首先要有這個(gè)結(jié)構(gòu):

//清單 3. 內(nèi)存控制塊結(jié)構(gòu)定義

struct mem_control_block {

int is_available;

int size;

};

現(xiàn)在,您可能會(huì)認(rèn)為當(dāng)程序調(diào)用 malloc 時(shí)這會(huì)引發(fā)問(wèn)題 —— 它們?nèi)绾沃肋@個(gè)結(jié)構(gòu)?答案是它們不必知道;在返回指針之前,我們會(huì)將其移動(dòng)到這個(gè)結(jié)構(gòu)之后,把它隱藏起來(lái)。這使得返回的指針指向沒(méi)有用于任何其他用途的內(nèi)存。那樣,從調(diào)用程序的角度來(lái)看,它們所得到的全部是空閑的、開(kāi)放的內(nèi)存。然后,當(dāng)通過(guò) free() 將該指針傳遞回來(lái)時(shí),我們只需要倒退幾個(gè)內(nèi)存字節(jié)就可以再次找到這個(gè)結(jié)構(gòu)。

在討論分配內(nèi)存之前,我們將先討論釋放,因?yàn)樗?jiǎn)單。為了釋放內(nèi)存,我們必須要做的惟一一件事情就是,獲得我們給出的指針,回退 sizeof(struct mem_control_block) 個(gè)字節(jié),并將其標(biāo)記為可用的。這里是對(duì)應(yīng)的代碼:

清單 4. 解除分配函數(shù)

void free(void *firstbyte) {

struct mem_control_block *mcb;

mcb = firstbyte - sizeof(struct mem_control_block);

mcb-is_available = 1;

return;

}

如您所見(jiàn),在這個(gè)分配程序中,內(nèi)存的釋放使用了一個(gè)非常簡(jiǎn)單的機(jī)制,在固定時(shí)間內(nèi)完成內(nèi)存釋放。分配內(nèi)存稍微困難一些。我們主要使用連接的指針遍歷內(nèi)存來(lái)尋找開(kāi)放的內(nèi)存塊。這里是代碼:

//清單 6. 主分配程序

void *malloc(long numbytes) {

void *current_location;

struct mem_control_block *current_location_mcb;

void *memory_location;

if(! has_initialized) {

malloc_init();

}

numbytes = numbytes + sizeof(struct mem_control_block);

memory_location = 0;

current_location = managed_memory_start;

while(current_location != last_valid_address)

{

current_location_mcb =

(struct mem_control_block *)current_location;

if(current_location_mcb-is_available)

{

if(current_location_mcb-size = numbytes)

{

current_location_mcb-is_available = 0;

memory_location = current_location;

break;

}

}

current_location = current_location +

current_location_mcb-size;

}

if(! memory_location)

{

sbrk(numbytes);

memory_location = last_valid_address;

last_valid_address = last_valid_address + numbytes;

current_location_mcb = memory_location;

current_location_mcb-is_available = 0;

current_location_mcb-size = numbytes;

}

memory_location = memory_location + sizeof(struct mem_control_block);

return memory_location;

}

這就是我們的內(nèi)存管理器。現(xiàn)在,我們只需要構(gòu)建它,并在程序中使用它即可.多次調(diào)用malloc()后空閑內(nèi)存被切成很多的小內(nèi)存片段,這就使得用戶(hù)在申請(qǐng)內(nèi)存使用時(shí),由于找不到足夠大的內(nèi)存空間,malloc()需要進(jìn)行內(nèi)存整理,使得函數(shù)的性能越來(lái)越低。聰明的程序員通過(guò)總是分配大小為2的冪的內(nèi)存塊,而最大限度地降低潛在的malloc性能喪失。也就是說(shuō),所分配的內(nèi)存塊大小為4字節(jié)、8字節(jié)、16字節(jié)、 18446744073709551616字節(jié),等等。這樣做最大限度地減少了進(jìn)入空閑鏈的怪異片段(各種尺寸的小片段都有)的數(shù)量。盡管看起來(lái)這好像浪費(fèi)了空間,但也容易看出浪費(fèi)的空間永遠(yuǎn)不會(huì)超過(guò)50%。

malloc(sizeof)是什么意思?

malloc(sizeof)是C語(yǔ)言,是向系統(tǒng)申請(qǐng)內(nèi)存空間的函數(shù)。

sizeof一般用于獲取字符串的長(zhǎng)度,是處理字符串的重要工具。

同時(shí),sizeof在數(shù)據(jù)結(jié)構(gòu)這門(mén)課中是創(chuàng)建結(jié)點(diǎn)必要的命令。

例:*head=(node*)malloc(sizeof(node)); [注]node為結(jié)構(gòu)體。

sizeof(node)表示獲取node類(lèi)型的長(zhǎng)度,malloc(sizeof(node))表示在內(nèi)存中申請(qǐng)一個(gè)node長(zhǎng)度的空間。

關(guān)于C語(yǔ)言:

C語(yǔ)言是一門(mén)面向過(guò)程的、抽象化的通用程序設(shè)計(jì)語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā)。C語(yǔ)言能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器。

C語(yǔ)言是僅產(chǎn)生少量的機(jī)器語(yǔ)言以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的高效率程序設(shè)計(jì)語(yǔ)言。盡管C語(yǔ)言提供了許多低級(jí)處理的功能,但仍然保持著跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫(xiě)出的C語(yǔ)言程序可在包括類(lèi)似嵌入式處理器以及超級(jí)計(jì)算機(jī)等作業(yè)平臺(tái)的許多計(jì)算機(jī)平臺(tái)上進(jìn)行編譯。

利用sizeof() 函數(shù)計(jì)算C語(yǔ)言中各種數(shù)據(jù)類(lèi)型所占用的存儲(chǔ)空間的大小

枚舉類(lèi)型,在C語(yǔ)言中求sizeof,可以先定義一個(gè)枚舉類(lèi)型,然后對(duì)枚舉類(lèi)型中的元素,或者對(duì)類(lèi)型求size,獲取到內(nèi)存長(zhǎng)。

代碼如下

#includestdio.h

enum TEST

{

TEST0,

TEST1,

TEST2

};

int main()

{

printf("size of TEST is %d\n", sizeof(TEST));//用類(lèi)型求大小。

printf("size of TEST is %d\n", sizeof(TEST1));//用元素求大小。

return 0;

}

對(duì)于枚舉類(lèi)型,區(qū)分是否有負(fù)數(shù)值,系統(tǒng)會(huì)按照unsigned int或int來(lái)處理,而是否帶符號(hào),并不影響int的占用空間。所以任意枚舉類(lèi)型或枚舉變量,占用的空間都是和平臺(tái)實(shí)現(xiàn)時(shí)的int類(lèi)型相同。對(duì)于主流的32位/64位平臺(tái),枚舉類(lèi)型均占4字節(jié)。即sizeof結(jié)果為4。

名稱(chēng)欄目:c語(yǔ)言?xún)?nèi)存占取函數(shù) c語(yǔ)言所占內(nèi)存空間大小怎么輸出
文章鏈接:http://chinadenli.net/article28/dojgdcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化靜態(tài)網(wǎng)站外貿(mào)網(wǎng)站建設(shè)品牌網(wǎng)站制作App開(kāi)發(fā)定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化