日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据对齐

發布時間:2024/5/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据对齐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是數據對齊?

一般情況下,當我們定義一個變量,編譯器會按照默認的地址對齊方式,來給該變量分配一個存儲空間地址。如果該變量是一個 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 分配存儲空間。

為什么要數據對齊?

  • 通過 aligned 這個屬性聲明,我們雖然可以顯式指定變量的地址對齊方式,但是也會因邊界對齊造成一定的內存空洞,浪費一定的內存空間。比如在上面這個程序中,0x00402009~0x0040200b 這三個地址空間的存儲單元就沒有被使用。
  • 既然地址對齊會造成一定的內存空洞,那我們為什么還要按照這種對齊方式去存儲數據呢?
    一個主要原因就是,這種對齊設置可以簡化 CPU 和內存 RAM 之間的接口和硬件設計。比如一個32位的計算機系統,CPU 讀取內存時,硬件設計上可能只支持4字節或4字節倍數對齊的地址訪問,CPU 每次往內存 RAM 讀寫數據時,一個周期可以讀寫4個字節。如果我們把一個數據放在4字節對齊的地址上,那么CPU一次就可以把數據讀寫完畢;如果我們把一個 int 型數據放在一個非4字節對齊的地址上,那 CPU 就要分2次才能把這個4字節大小的數據讀寫完畢。
  • 為了配合計算機的硬件設計,編譯器在編譯程序時,對于一些基本數據類型,比如 int、char、short、float 等,會按照其數據類型的大小進行地址對齊,按照這種地址對齊方式分配的存儲地址,CPU一次就可以讀寫完畢。雖然邊界對齊會造成一些內存空洞,浪費一些內存單元,但是在硬件上的設計卻大大簡化了。這也是編譯器給我們定義的變量分配地址時,不同類型變量按不同字節數地址對齊的原因。除了 int、char、short、float 這些基本類型數據,對于一些復合類型數據,也要滿足地址對齊要求。
  • 總結

    以上是生活随笔為你收集整理的数据对齐的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。