C C 位元組對齊

2021-07-04 22:02:06 字數 878 閱讀 5784

1 背景

陣列:按照基本資料型別對齊,第乙個對齊了後面的自然也就對齊了。 

聯合:按其包含的長度最大的資料型別對齊。 

結構體: 結構體中每個資料型別都要對齊。

本文重點分析結構體的對齊方式。

2 結構體中位元組對齊的案例分析

2.1 結構體一

struct a  a;         // 由於本結構體最大的成員是4位元組對齊,因此本結構體整體以4位元組對齊
位元組對齊情況:

sizeof(a) = 12; // struct a以4位元組對齊,因此後面補充兩個位元組

&a.a = 0;

&a.b = 4; // 位址4位元組對齊

&a.c = 8;

2.2 結構體二

struct a ;
位元組對齊情況:

sizeof(a) = 8;

&a.a = 0;

&a.b = 2; // 位址2位元組對齊

&a.c = 4; // 位址4位元組對齊

3 g++中設定直接對齊的方法: __attribute__((packed))

#include struct a  __attribute__ ((packed));

int main(void)

如上所示,新增了__attribute__((packed))後,a占用的空間為6位元組,而不是8位元組。

[1]c語言位元組對齊

[2]5分鐘搞定記憶體位元組對齊

C C 位元組對齊

什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...

c c 位元組對齊

什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...

C C 位元組對齊

概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。為什麼位元組需要對齊 根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為0x...