語法書 / AA 競程語法書 上冊 / 第二單元 / 記憶體與計量單位

2.2 記憶體與計量單位

知道有哪些型態後,我們來看它們各自佔多少記憶體空間。但在那之前,先搞懂「記憶體」到底是什麼。

什麼是記憶體?

程式執行時用到的資料——你宣告的每個變數、cin 讀進來的數字……——都得先「放在某個地方」,這個地方就是電腦的記憶體(memory,也就是常聽到的 RAM)。可以把它想成電腦的工作桌:程式一邊跑,一邊把正在用的東西攤在桌上隨手取用;桌子越大(記憶體越多),能同時攤開的東西就越多。

(記憶體在關機後就清空了,跟「永久保存檔案」的硬碟是兩回事——這裡先知道有這個差別就好。)每個變數其實就是記憶體裡的一小塊空間,不同型態佔的大小不同,這節就來看這件事。

記憶體的計量單位

電腦用位元(bit)作為最小儲存單位,一個 bit 只能存 0 或 1。把 8 個 bit 合起來就是 1 位元組(byte),這是最常用的單位。

1 byte  = 8 bits
1 KB    = 1,024 bytes
1 MB    = 1,024 KB
1 GB    = 1,024 MB
1 TB    = 1,024 GB

1 GB 到底有多大?

這些單位很抽象,換成生活中常見的東西就有感覺了(以下都是大概的量級,會隨格式、畫質而變):

東西 大約大小
一個英文字母或數字 1 byte
一個中文字 約 3 bytes
一則純文字訊息(幾十個字) 幾十 ~ 上百 bytes
一張手機拍的照片 約 2 ~ 5 MB
一首歌(MP3) 約 3 ~ 5 MB
一分鐘的手機短影音(1080p) 約 50 ~ 100 MB

所以 1 GB(≈ 1,024 MB) 大約可以裝:十幾分鐘的高畫質影片、或 200~300 首歌、或好幾百張照片。

回頭看程式:一個 int 只佔 4 bytes,非常小——在 1 GB 的記憶體裡可以放下大約兩億多個 int。也就是說,平常處理的數字資料量,遠遠用不到這麼大的空間。

每種型態佔多少記憶體

上一節的幾種基本型態,各自佔用的空間如下:

型態 佔用空間
char 1 位元組
bool 1 位元組
int 4 位元組
double 8 位元組

型態佔的空間越大,能表示的數值範圍通常也越大(整數型態的範圍,下一節會細講)。

用 sizeof 查詢佔用空間

sizeof 可以在程式裡查詢一個資料型態或變數佔用多少位元組:

#include <iostream>
using namespace std;

int main() {
    int x = 42;
    cout << "int takes " << sizeof(int) << " bytes" << endl;   // 對「型態」取
    cout << "x takes " << sizeof(x) << " bytes" << endl;      // 對「變數」取,x 是 int 所以也是 4
    cout << "char takes " << sizeof(char) << " bytes" << endl;
    cout << "double takes " << sizeof(double) << " bytes" << endl;
    return 0;
}

執行結果:

int takes 4 bytes
x takes 4 bytes
char takes 1 bytes
double takes 8 bytes