数据对齐
什么是數據對齊?
一般情況下,當我們定義一個變量,編譯器會按照默認的地址對齊方式,來給該變量分配一個存儲空間地址。如果該變量是一個 int 型數據,那么編譯器就會按4字節或4字節的整數倍對齊;如果該變量是一個 short 型數據,那么編譯器就會按2字節或2字節的整數倍邊界對齊;如果是一個 char 類型的變量,那么編譯器就會按照1字節對齊。
#include <stdio.h>int a = 1; int b = 2; char c1 = 3; char c2 = 4; int main(void) {printf("a: %p\n",&a);printf("b: %p\n",&b);printf("c1:%p\n",&c1);printf("c2:%p\n",&c2);return 0; }在上面的程序中,我們分別定義2個 int 型變量,2個 char 型變量,然后分別打印它們的地址,運行結果如下。
a: 00402000 b: 00402004 c1: 00402008 c2: 00402009通過運行結果我們可以看到,對于 int 型數據,其在內存中的地址都是以4字節或4字節整數倍對齊的。而 char 類型的數據,其在內存中是以1字節對齊的。變量 c2 就直接分配到了 c1 變量的下一個存儲單元,不用像 int 數據那樣考慮4字節對齊。接下來,我們修改一下程序,指定變量 c2 按4字節對齊。
#include <stdio.h>int a = 1; int b = 2; char c1 = 3; char c2 __attribute__((aligned(4))) = 4; int main(void) {printf("a: %p\n",&a);printf("b: %p\n",&b);printf("c1:%p\n",&c1);printf("c2:%p\n",&c2);return 0; }運行結果如下。
a: 00402000 b: 00402004 c1: 00402008 c2: 0040200C通過運行結果可以看到,字符變量 c2 由于使用 aligned 屬性聲明按照4字節邊界對齊,所以編譯器不可能再給其分配 0x00402009 這個地址,因為這個地址不是4字節對齊的。編譯器空出3個字節單元,直接從 0x0040200C 這個地址上給變量 c2 分配存儲空間。
為什么要數據對齊?
一個主要原因就是,這種對齊設置可以簡化 CPU 和內存 RAM 之間的接口和硬件設計。比如一個32位的計算機系統,CPU 讀取內存時,硬件設計上可能只支持4字節或4字節倍數對齊的地址訪問,CPU 每次往內存 RAM 讀寫數據時,一個周期可以讀寫4個字節。如果我們把一個數據放在4字節對齊的地址上,那么CPU一次就可以把數據讀寫完畢;如果我們把一個 int 型數據放在一個非4字節對齊的地址上,那 CPU 就要分2次才能把這個4字節大小的數據讀寫完畢。
總結
- 上一篇: 鱼油的作用
- 下一篇: 虹科工业树莓派的应用:在节能建筑中的应用