對于嵌入式系統來說,記憶體很寶貴,那麼在程式設計的時候就要盡量使自己用的資料結構所用的記憶體少,而結構體是C程式設計中經常用到的結構,保證結構體大小盡量的合理是很重要的。下面說一下如何判斷一個結構體的大小。
首先需要了解總線寬度和自然邊界這倆個概念,編譯器在配置設定結構體時根據這倆個因素來計算偏移量和空間占用。
總線寬度:
總線寬度就是一個處理器通路周期最多可以通路多少位的資料。總線寬度分為BUS16,BUS32,BUS64。
自然邊界:
每一個C的類型都有自然邊界,如果某種類型資料所處位址是N的整數倍時通路效率最高,那麼這種類型的自然邊界就是數字N。
下面是C語言資料類型的大小和自然邊界值:
C資料類型 | 大小 | BUS16 | BUS32/64 |
Char | 1 | 1 | |
short | 2 | 2 | |
Int | 4 | 2 | 4 |
指針 | 4 | 2 | 4 |
long | 4 | 2 | 4 |
bit | --- | 很整形一樣 | |
float | 4 | 2 | 4 |
double | 8 | 2 | 4/8 |
struct | -- | 和具有最大需要的資料成員一緻 | |
union | -- | 和具有組大的資料成員一緻 |
對結構體而言,結構體的自然邊界與最大的資料成員一緻,也就是說結構體的大小就是元素的個數乘以最大成員的自然邊界。其它元素中間需要填充位元組。
下面是幾個例子,都是對于BUS32說的,BUS16和64都對照表就行了:
struct simple
{
char a;`//它的自然邊界就是int的自然邊界,是以它的大小為12.
int b; //它的結構是這樣的:{a000bbbbc000},每一個字母代表一個位元組,0代表填充位元組
char c;
};
struct outer
{
char x;<span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-serif;">//simple的自然邊界是4,是以char也要填充資料,大小為16</span>
struct simple y; //{x000{a000bbbbc000}}
};
struct point<span style="white-space:pre"> </span>//自然邊界是double,4,大小為20,{c000xxxxxxxxyyyyyyyy}
{
char c;
double x,y;
};
注意自然邊界不都是等于該資料類型的大小。
#include <stdio.h>
struct simple
{
char a;
int b;
char c;
};
struct outer
{
char x;
struct simple y;
};
struct point
{
char c;
double x,y;
};
int main()
{
struct simple vect[2];
//printf("%d\n",sizeof(struct simple));
//printf("%d\n",sizeof(vect));
//printf("%d\n",sizeof(struct outer));
printf("%d\n",sizeof(struct point));
return 0;
}
寫個小程式測試一下對不對。