如何判斷一個結構體的大小

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章