对于嵌入式系统来说,内存很宝贵,那么在编程的时候就要尽量使自己用的数据结构所用的内存少,而结构体是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;
}
写个小程序测试一下对不对。