測試環境:Linux 64-bit, GCC 編譯。循環 `new char[size]` 100 萬次,觀察 `top` 中 RES (常駐記憶體):
| 請求大小 | 實際 RES | 倍數關係 |
|---|---|---|
| 1 Byte | 32 MB | 32 × 1M |
| 24 Byte | 32 MB | 32 × 1M |
| 25 Byte | 48 MB | 48 × 1M |
疑問:為何 1~24 Byte 同佔 32 Byte?25 Byte 突然跳到 48 Byte?



#define SIZE_SZ (sizeof(INTERNAL_SIZE_T)) // 64-bit 為 8
#define MALLOC_ALIGNMENT (2 * SIZE_SZ) // 16 bytes (2*指針大小)
#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1) // 0xF
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; // 前一塊大小 (若空閒)
INTERNAL_SIZE_T size; // 當前塊大小 + 標誌位
struct malloc_chunk* fd; // 雙向鏈表 (空閒時)
struct malloc_chunk* bk;
};
#define MIN_CHUNK_SIZE (sizeof(struct malloc_chunk)) // 32 bytes (64-bit)
#define MINSIZE (((MIN_CHUNK_SIZE + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)) // 32
// 核心對齊計算
#define request2size(req) \
(((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
MINSIZE : \
((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
| 參數 | 值 | 說明 |
|---|---|---|
| SIZE_SZ | 8 | size_t 大小 = 指針大小 |
| MALLOC_ALIGNMENT | 16 | 對齊單位 = 2 × 指針大小 |
| MIN_CHUNK_SIZE | 32 | chunk header 大小 (prev_size + size + fd + bk) |
| MINSIZE | 32 | 最小分配單位 (對齊後) |