系統如何給變量分配內存?
定義一個變量,計算機系統是需要為其分配內存的,變量名就是一個名字而已,代表的是具體的一個對象,內存地址就是對象所存在的空間的地址,而內存在計算機中最小以位(bit)為單位,一個字節等于8位,對象大小都以字節為單位計算。char類型的變量(對象)占1個字節的空間(內存),int類型的變量(對象)占用4個字節的空間(內存)。
內存分配規則程序內存分配一般按照以下規則:
1、代碼區: 存儲機器碼序列/全局常量/代碼/字符串常量。
2、全局區: 全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另 一塊區域。 程序結束后由系統釋放。未初始化數據段[.bss]: 未初始化的全局變量/未初始化的(局部/全局)靜態變量(static修飾的變量)。
3、堆(從低地址往高低至增長): 所使用的局部變量還是在棧上,內容則在堆上.手動釋放或者程序結束時由操作系統釋放回收。由程序員分配[new/malloc/realloc/calloc]。windows下, 申請的堆空間一般小于2GB。
4、棧(從高地址往低地址增長): 局部變量/局部常量(const)[局部只讀變量]/函數調用時返回地址/調用者的環境信息(例如某些機器寄存器)。
通過一段代碼加注釋的方式來大致說明一下變量在各情況下的存儲區域:見圖
指針變量占用內存指針變量也需要系統為其分配內存,只不過內存存儲的是其所指向對象的內存的地址。一個任何類型的指針變量所占的字節大小都為4個字節。
內存是由字節組成的,每個字節都有一個編號。指針變量主要是存放相同數據類型的變量的首地址。這里的這個地址其實就是內存的某個字節的編號。而這個編號的確定是與地址總線有關。如果地址總線是32位,則它的尋址范圍是0~2^32(0~4G)。那么為一個字節的編址就會由32個0或者1組成。例如第一個字節的編址是32個0,最后一個的編址是32個1。一個字節有8位,32位則需要4個字節。
new實例化時內存會發生什么然后我們來講一下在對一個類用new實例一個對象時會發生什么。還是用上面用到的代碼,前面有說過Test t_;t_對象是存在棧區的。new在對象實例化的時候會在堆開辟一個空間以用來存儲類的成員變量,而成員函數并不存在于對象的內存空間。實例化完后后,若未對對象成員變量賦值,相應內存的未存入數據,若對成員變量賦值,則會從代碼區將常量復制一份到該內存;另外我們通過sizeof(t)和sizeof(t_)會發現其大小等于int和string的大小相加;這說明對象中并不含成員函數的數據;