回覆列表
  • 1 # 使用者6433578855249

    不一樣。64位系統指標佔64位。32位系統指標佔32位。

    事實上32位系統最大可用記憶體不超過4gb就是因為地址長度限制。

    但是也有特例,比如 32位 Ubuntu 的 PAE(物理地址擴充套件)功能可定址範圍為36位,而其指標大小本人並不清楚。

  • 2 # 程式設計老大叔

    定義一個變數,計算機系統是需要為其分配記憶體的,變數名就是一個名字而已,代表的是具體的一個物件,記憶體地址就是物件所存在的空間的地址,而記憶體在計算機中最小以位(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的大小相加;這說明物件中並不含成員函式的資料;

  • 中秋節和大豐收的關聯?
  • 如何克服矯情的心理?