c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗
生活随笔
收集整理的這篇文章主要介紹了
c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
來自公眾號:技術讓夢想更偉大
#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;
}
#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;
}
#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;
}
我們用一次malloc申請多個(數組)地址的是連續地址 。 多次malloc 申請地址,通過對每一次申請的內存空間地址和上一塊地址?(p-1)作比較發現,地址并不是連續的。 系統在每次malloc時,從相隔固定長度起開始分配。
提出問題
我們在寫程序中經常會用到malloc函數進行動態內存分配,但是我們有沒有想過,在C語言中,向操作系統請求malloc內存空間的地址是連續的嗎???
測試
我使用的是win7+32位操作系統(是不是太low了,對,就是10年買的電腦),下面我們從不同申請的方式來測,從而看看申請的是否連續地址。
每次申請一塊內存空間
#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;
}
測試結果如下
感覺像是有個固定的間隔,這里測試結果間隔是0x20,但地址并不是連續地址,具體為什么后面我們會講到。
用數組一次malloc 分配多個虛擬地址
#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;
}
結果如下:
可以看出,用一次malloc申請多個(數組)地址的是連續地址 ,結果也應證了。
多次malloc 申請空間是否連續的呢?
#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;
}
循環10次結果如下
循環100次結果如下
循環1000次結果如下
測試結果
為什么呢?
其實這就是內存邊界對齊的問題,使用malloc分配的內存空間在虛擬地址空間上是連續的,但是轉換到物理內存空間上有可能是不連續的,
對用戶而言,所有內存都是虛擬的,程序并不是直接運行在物理內存上,而是運行在虛擬內存上,然后由虛擬內存轉換到物理內存。
虛擬內存地址到物理內存地址進行轉換時,因為有可能相鄰的兩個字節是在不同的物理分頁上,所以不一定是連續的。
延伸一下
本篇主要是想拋磚引玉,大家可以在自己電腦測試一下,后期會細節講到字節對齊原則及作用,malloc的原理和內存分配,內存分頁等問題。
●編號772,輸入編號直達本文
●輸入m獲取文章目錄
C語言與C++編程分享C/C++技術文章
總結
以上是生活随笔為你收集整理的c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 5.7.14编译安装_源码编
- 下一篇: mysql下 ect p_Linux系统