怎样推断一个结构体的大小

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




posted @ 2018-02-08 21:10  zhchoutai  阅读(381)  评论(0编辑  收藏  举报