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