__packed 關鍵字

__packed 關鍵字的作用

我們在c語言中創建一個結構體時,編譯器都會自動進行字節對齊操作,這樣做是爲了解決CPU讀取數據的效率問題。比如我們隨便申請一個結構體:
struct textStr
{
char i;
int j;
float m;
double n;
}

編譯器在編譯這個結構體時,會自動對齊數據,我們這裏用的是32位的單片機,所以每當我們的結構體變量的地址不滿足 0x0000 0004 * n (n=0…1…2…3…4…),就會自動把結構體變量地址補齊爲以4字節爲邊界的地址。比如結構體textStr的大小按道理來講應該爲char(1)+int(4)+float(4)+double(8) = 17字節大小,但是我們sizeof以後會發現該結構體大小爲24字節大小。舉個例子,編譯器申請的char地址爲0x0000 0001,不滿足以4字節爲邊界的地址這個條件,所以會自動把char的地址補至0x0000 0004。這樣編譯器增強效率(以浪費內存爲代價)。

如果我們不在意效率問題,想取消編譯器自動對齊數據這個機制的話,就可以用到我們的__packed 關鍵字:
type __packed struct
{
char i;
int j;
float m;
double n;
}textStr;
下面上程序:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

typedef struct 
{
	char i;
	int j;
	double n;
	float m;
}textStr1;

typedef __packed struct
{
	char i;
	int j;
	float m;
	double n;
}textStr2;


int main(void)
{ 
	delay_init(168);		  //初始化延時函數
	LED_Init();		        //初始化LED端口
	uart_init(115200);
	
	//printf("char的大小爲:%d,int的大小爲:%d,float的大小爲:%d,double的大小爲:%d\r\n",sizeof(char),sizeof(int),sizeof(float),sizeof(double));
	
	printf("結構體textStr1的內存大小爲: %d\r\n",sizeof(textStr1));
	printf("結構體textStr2的內存大小爲: %d\r\n",sizeof(textStr2));
	
	while(1);
}

通過串口調試助手我們可以得到:
在這裏插入圖片描述
綜上所述,__packed關鍵字可以幫助我們取消編譯器對結構體的自動對齊機制,從而幫助我們節省空間,但是隨之而來的,就是CPU讀取數據的效率會下降,所以這個關鍵字也要根據我們的實際情況來使用!!!

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