什麼是對齊與填充

把資料放在依型別決定之數的倍數位址上(對齊),以及為此在資料之間或後面加入的不使用的位元組(填充)。在 int 對齊到4位元組邊界的環境中,struct { char c; int i; char d; } 會在 c 之後加入3位元組、在 d 之後加入3位元組,大小為12位元組。在未對齊的位址讀寫,依CPU不同可能變慢或引發例外。把成員從大的型別依序排列,可以減少填充。

日文名稱: アライメントとパディング

「對齊與填充」出現在2領域的2道練習題中(指令集與組合語言, C語言基礎等)。

這個名詞所屬的領域: C語言基礎

練習對齊與填充的題目

在RISC-V中,當讀取4個位元組的lw指令的位址不是4的倍數(邊界未對齊)時,下列何者是可能發生的事?

  1. A指令會自動被改讀為下一個4的倍數的位址,永遠以相同的速度正確讀取
  2. B依CPU的實作,可能發生例外,或是由硬體或軟體處理而變得非常慢
  3. C位址的低2位元會被忽略,不會產生錯誤
查看答案與解析

正確答案:B. 依CPU的實作,可能發生例外,或是由硬體或軟體處理而變得非常慢

若將4位元組的資料放在4的倍數的位址,一次記憶體存取就能讀取。跨越邊界則需要兩次存取,因此RISC-V將邊界錯位的存取,是以電路處理,還是引發例外交給軟體處理,委由實作決定。若是後者,會慢上好幾個數量級。編譯器會在結構成員之間加入填充(padding)來對齊,就是這個緣故。

解析中的「對齊與填充」

出現「對齊與填充」的題目(2題)

  1. 在RISC-V中,當讀取4個位元組的lw指令的位址不是4的倍數(邊界未對齊)時,下列何者是可能發生的事?
  2. 假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?

相關名詞

結構(struct) 陣列 巨集(macro) 未定義行為 位元欄位(bit-field) 函式指標 前置處理器 指標(pointer) 記憶體洩漏 動態記憶體配置

前往名詞解釋列表