對於嵌入式系統來說,內存很寶貴,那麼在編程的時候就要儘量使自己用的數據結構所用的內存少,而結構體是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;
}
寫個小程序測試一下對不對。