首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

結構體大小計算:對齊規則與實際佔用字節數分析

     編輯:程式設計綜合問答

問題結構體定義

typedef struct _person {
    char firstname;
    char lastname;
    char *title;
    unsigned int age;
    char sex;
    struct spring ls;
} Person;

核心結論

結構體大小不是成員大小簡單相加,必須考慮記憶體對齊。最終大小取決於:

  1. 各成員自身的對齊要求(通常等於其大小,指標為 4/8 字節)。
  2. 結構體整體對齊要求(等於最大成員對齊數)。
  3. 編譯器具體實現(#pragma pack、編譯選項)與嵌套結構體 spring 的內部佈局。

以 64 位系統為例推演(假設 spring 為空結構體)

成員偏移大小說明
firstname01char 對齊 1
lastname11緊湊
填充26為 title (指標 8 字節) 對齊補齊
title88指標 8 字節對齊
age164unsigned int 4 字節對齊
sex201char
填充217為 spring 對齊(假設 spring 含 8 字節成員)
ls (spring)28?視 spring 定義而定

總大小 = 最後一個成員結束位置向上取整到最大對齊數(通常 8)的倍數。

驗證方法

#include <stdio.h>
#include <stddef.h>

struct spring { double dummy; }; // 假設含 8 字節成員

typedef struct _person {
    char firstname;
    char lastname;
    char *title;
    unsigned int age;
    char sex;
    struct spring ls;
} Person;

int main() {
    printf("sizeof(Person) = %zu\n", sizeof(Person));
    printf("offsetof(title) = %zu\n", offsetof(Person, title));
    printf("offsetof(ls) = %zu\n", offsetof(Person, ls));
    return 0;
}

輸出將隨 spring 定義、編譯器、對齊設定而變化,務必以目標平台實測為準。

最佳實踐

  • 按「大類型在前,小類型在後」排序成員,可減少填充。
  • 若需精確控制佈局,使用 #pragma pack(n) 或 C++11 alignas。
  • 跨平台序列化時,禁止直接傳輸結構體記憶體,應逐字段編解碼。

結構體大小計算是系統級開發基本功,理解對齊規則能避免介面不匹配、緩衝區溢出等隱患。

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