C語言結構體的記憶體分配
阿新 • • 發佈:2022-05-13
一、結構體記憶體分配原則
-
原則一:結構體中元素按照定義順序存放到記憶體中,但並不是緊密排列。從結構體儲存的首地址開始 ,每一個元素存入記憶體中時,它都會認為記憶體是以自己的寬度來劃分空間的,因此元素存放的位置一定會在自己大小的整數倍上開始。
-
原則二: 在原則一的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素長度的整數倍。若是,則結束;否則,將其補齊為它的整數倍。
注意:如果有充分的理由決定不對結構的成員進行重排,以減少因對齊帶來的空間損失。列如,為了提高程式的可維護性和可讀性,將相關的結構成員儲存在一起。應該根據結構成員的邊界需要進行重排,減少因邊界對齊而造成的記憶體損失。
二、結構體長度
- sizeof操作能夠得出一個結構的整體長度,包括因邊界對齊而跳過的那些位元組。
- 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; }
執行結果:
從執行結果可以得出 結構成員排序會影響記憶體的大小。