日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗

發(fā)布時(shí)間:2024/9/30 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
來(lái)自公眾號(hào):技術(shù)讓夢(mèng)想更偉大

提出問(wèn)題

我們?cè)趯懗绦蛑薪?jīng)常會(huì)用到malloc函數(shù)進(jìn)行動(dòng)態(tài)內(nèi)存分配,但是我們有沒(méi)有想過(guò),在C語(yǔ)言中,向操作系統(tǒng)請(qǐng)求malloc內(nèi)存空間的地址是連續(xù)的嗎???

測(cè)試

我使用的是win7+32位操作系統(tǒng)(是不是太low了,對(duì),就是10年買的電腦),下面我們從不同申請(qǐng)的方式來(lái)測(cè),從而看看申請(qǐng)的是否連續(xù)地址。

每次申請(qǐng)一塊內(nèi)存空間

#include?"stdio.h"
#include?"stdlib.h"?

int?main()
{
?
?void?*addr0?=?malloc(0);
?void?*addr1?=?malloc(1);
?void?*addr2?=?malloc(2);
?printf("%p\n",addr0?);

?printf("%p\n",?addr1);
?printf("%p\n",?addr2);

?printf("%ld\n",?addr1?-?addr0);
?printf("%ld\n",?addr2?-?addr1);
?free(addr0);
?free(addr1);
?free(addr2);
?
?return?0;
}

測(cè)試結(jié)果如下

感覺(jué)像是有個(gè)固定的間隔,這里測(cè)試結(jié)果間隔是0x20,但地址并不是連續(xù)地址,具體為什么后面我們會(huì)講到。

用數(shù)組一次malloc 分配多個(gè)虛擬地址

#include?"stdio.h"
#include?"stdlib.h"?

int?main()
{
??int*?p;
?int?i;
? p?=?(int?*)malloc(10*sizeof(int));

?for?(i?=?0;?i? ?{
??p[i]?=?i;
? ?printf("%d----%p\n",?p[i],&p[i]);
?}

? getchar();
?
?return?0;
}

結(jié)果如下:

可以看出,用一次malloc申請(qǐng)多個(gè)(數(shù)組)地址的是連續(xù)地址 ,結(jié)果也應(yīng)證了。

多次malloc 申請(qǐng)空間是否連續(xù)的呢?

#include?"stdio.h"
#include?"stdlib.h"?

int?main()
{
?
??int*?p;
? int?i;
?
?for?(i?=?0;?i? ?{
??p?=?(int*)malloc(sizeof(int));
? ?*p?=?i;

? ?printf("%d-----%p----%p\n",?*p,?p,?p-1);
? }
?
? getchar();
?
?return?0;
}

循環(huán)10次結(jié)果如下

循環(huán)100次結(jié)果如下

循環(huán)1000次結(jié)果如下

測(cè)試結(jié)果

  • 我們用一次malloc申請(qǐng)多個(gè)(數(shù)組)地址的是連續(xù)地址 。
  • 多次malloc 申請(qǐng)地址,通過(guò)對(duì)每一次申請(qǐng)的內(nèi)存空間地址和上一塊地址?(p-1)作比較發(fā)現(xiàn),地址并不是連續(xù)的。
  • 系統(tǒng)在每次malloc時(shí),從相隔固定長(zhǎng)度起開(kāi)始分配。
  • 為什么呢?

    其實(shí)這就是內(nèi)存邊界對(duì)齊的問(wèn)題,使用malloc分配的內(nèi)存空間在虛擬地址空間上是連續(xù)的,但是轉(zhuǎn)換到物理內(nèi)存空間上有可能是不連續(xù)的,

    對(duì)用戶而言,所有內(nèi)存都是虛擬的,程序并不是直接運(yùn)行在物理內(nèi)存上,而是運(yùn)行在虛擬內(nèi)存上,然后由虛擬內(nèi)存轉(zhuǎn)換到物理內(nèi)存。

    虛擬內(nèi)存地址到物理內(nèi)存地址進(jìn)行轉(zhuǎn)換時(shí),因?yàn)橛锌赡芟噜彽膬蓚€(gè)字節(jié)是在不同的物理分頁(yè)上,所以不一定是連續(xù)的。

    延伸一下

    本篇主要是想拋磚引玉,大家可以在自己電腦測(cè)試一下,后期會(huì)細(xì)節(jié)講到字節(jié)對(duì)齊原則及作用,malloc的原理和內(nèi)存分配,內(nèi)存分頁(yè)等問(wèn)題。


    ●編號(hào)772,輸入編號(hào)直達(dá)本文

    ●輸入m獲取文章目錄

    C語(yǔ)言與C++編程

    分享C/C++技術(shù)文章

    總結(jié)

    以上是生活随笔為你收集整理的c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。