1. 程式人生 > 其它 >C語言結構體的記憶體分配

C語言結構體的記憶體分配

一、結構體記憶體分配原則

  1. 原則一:結構體中元素按照定義順序存放到記憶體中,但並不是緊密排列。從結構體儲存的首地址開始 ,每一個元素存入記憶體中時,它都會認為記憶體是以自己的寬度來劃分空間的,因此元素存放的位置一定會在自己大小的整數倍上開始。

  2. 原則二: 在原則一的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素長度的整數倍。若是,則結束;否則,將其補齊為它的整數倍。

    注意:如果有充分的理由決定不對結構的成員進行重排,以減少因對齊帶來的空間損失。列如,為了提高程式的可維護性和可讀性,將相關的結構成員儲存在一起。應該根據結構成員的邊界需要進行重排,減少因邊界對齊而造成的記憶體損失。

二、結構體長度

  1. sizeof操作能夠得出一個結構的整體長度,包括因邊界對齊而跳過的那些位元組。
  2. offsetof能查詢指定成員的實際位置
    offsetof(type, member);
    // type 結構體型別
    // member 結構體成員
    

三、測試程式

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


int main(int argc, char *argv[]) {

    struct struct_test1 {
        char a;
        int b;
        char c;
    };

    struct struct_test2 {
        int a;
        char b;
        char c;
    };

    printf("The length of structure test1 is: %ld \r\n", sizeof(struct struct_test1) );
    printf("Location of parameter B: %ld \r\n", offsetof(struct struct_test1, c) );


    printf("The length of structure test1 is: %ld \r\n", sizeof(struct struct_test2) );
    printf("Location of parameter B: %ld \r\n", offsetof(struct struct_test2, c) );

    return 0;
}

執行結果:

從執行結果可以得出 結構成員排序會影響記憶體的大小。