首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C 語言結構體位域(位段)詳解與記憶體對齊實測

     編輯:C++ 入門

C 語言結構體位域(位段)詳解與記憶體對齊實測

當資料只需幾個位元(如開關狀態 0/1)時,佔用完整位元組顯得浪費。C 語言提供位域(Bit-field),可將一個位元組劃分為多個命名區域,各佔指定位元數,以節省空間並簡化操作。

一、位域定義與變數宣告

語法與結構體類似:

struct 位域結構名 {
    型別 位域名 : 位域長度;
    // ...
};

範例:

struct bs {
    int a : 8;
    int b : 2;
    int c : 6;
} data;  // 共佔 2 位元組

關鍵規則

  1. 不跨位元組:單一位域不得跨越兩個位元組。剩餘空間不足時,自動從下一位元組起始;也可刻意跳過(無名位域填充)。
  2. 長度限制:位域長度不得大於所屬型別大小(如 int 通常 32 位,但實際受限於位元組邊界)。
  3. 無名位域:可作填充/對齊用,不可存取。

二、位域使用實例與輸出分析

struct A { int a : 5; int b : 3; };
int main() {
    char str[100] = "0134324324afsadfsdlfjlsdjfl";
    struct A d;
    memcpy(&d, str, sizeof(A));
    printf("%d\n%d\n", d.a, d.b);
}

32 位 x86 輸出:-16 和 1。

解析:

  • 結構體對齊單位為最長成員(int 4 位元組),故 sizeof(A) == 4。
  • memcpy 將字串前 4 位元組 '0','1','3','4'(ASCII 0x30,0x31,0x33,0x34)拷入 d 低位元組。
  • 低位元組 0x30 = 00110000,低 5 位 10000(有號擴展為 -16),高 3 位 001(擴展為 1)。

三、位域對齊規則(VC / GCC 差異)

  1. 相鄰同型別、位寬總和 ≤ 型別大小 → 緊湊排列。
  2. 相鄰同型別、位寬總和 > 型別大小 → 下一個位域從新儲存單元(型別大小整數倍偏移)開始。
  3. 相鄰不同型別:VC6 不壓縮(各佔各自型別位元組);Dev-C++/GCC 壓縮(跨型別緊湊)。

系統先依對齊規則分配空間並填充,再進行位域操作。

四、實測程式碼與結果

struct ch1 { int a:1; int b:2; int c:5; } data1;
struct ch2 { char a:8; unsigned char b:7; char c:6; char d:3; char e:2; unsigned char f:1; int g; } data2;
struct ch3 { char a,b,c,d,e,f; int g; } data3; // 無位域版

printf("size: data1=%d data2=%d data3=%d\n", sizeof(data1), sizeof(data2), sizeof(data3));
// 輸出:4 8 12

data2 以位域壓縮 6 個 char 為 1 位元組,加上 int g 對齊至 4 位元組,共 8 位元組;data3 直排 6+4=10 位元組,對齊至 12 位元組。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved