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