C/C++結構體儲存
阿新 • • 發佈:2018-11-07
本文所採用的環境是WIN7-64位,VC++6.0
在本環境中資料型別所佔用的位元組數如下
我們定義的兩個結構體如下:
> 在first結構體中,short型別在第一位,int在第二位,並且int型別在此結構體成員中所佔的空間最大,因此此結構體中所有成員變數都要與這個所佔空間最大的型別對齊,故都為4B,因此第一個結構體所佔的總空間為12B,總空間浪費了5B(12B-2B-4B-1B).
>第second結構體中,int型別在第一位,所以後面的應該按第一位的對齊,但是由於後面的型別所佔的空間都比int少,short佔了來兩位元組後,4B的空間還剩2B,因此後面的char型別依舊可以填到這個剩餘的2個位元組中,總空間只浪費了1B(8B-4B-2B-1B).
在本環境中資料型別所佔用的位元組數如下
char 1B
int 4B
short 2B
double 8B
我們定義的兩個結構體如下:
#include <stdio.h>
typedef struct
{
short a;
int b;
char c;
}first;
typedef struct
{
int e;
short d;
char b;
}second;
> 在first結構體中,short型別在第一位,int在第二位,並且int型別在此結構體成員中所佔的空間最大,因此此結構體中所有成員變數都要與這個所佔空間最大的型別對齊,故都為4B,因此第一個結構體所佔的總空間為12B,總空間浪費了5B(12B-2B-4B-1B).
>第second結構體中,int型別在第一位,所以後面的應該按第一位的對齊,但是由於後面的型別所佔的空間都比int少,short佔了來兩位元組後,4B的空間還剩2B,因此後面的char型別依舊可以填到這個剩餘的2個位元組中,總空間只浪費了1B(8B-4B-2B-1B).
驗證
void main()
{
first a;
second b;
printf("sizeof(a) = %d,sizeof(b) = %d\n",sizeof(a),sizeof(b));
}
#include<stddef.h>中的offsetof來檢視變數的位置
結構體中帶有陣列的情況
它的儲存結構如下圖所示
結構體中帶有別的結構體的情況
它的儲存結構如下圖所示