sizeof與字節對齊用法

sizeof + 字節對齊

由於筆試中選擇、填空題目經常會考到字節對齊問題,涉及sizeof及字節對齊的相關知識,這裏記錄一下。

字節對齊相關知識,參考:C語言字節對齊問題詳解

實例
一般情況:
struct A{
    int    a;
    char   b;
    short  c;
};
struct B{
    char   b;
    int    a;
    short  c;
};
cout << sizeof(struct A) << endl;	// 結果是:8
cout << sizeof(struct B) << endl;	// 結果是:12

對於結構體A,sizeof(struct A)結果是8,按照int的4字節對齊,A中b爲1字節,補齊成2字節,再加上c的2字節,湊成4字節,因此是8字節;

對於結構體B ,sizeof(struct B)結果是12;按照int的4字節對齊,B中b需要補齊成4字節、c也需要補齊成4字節,共計12字節;

位域

位域相關知識,參考菜鳥教程中的:C 位域

struct
{
  unsigned int a : 1;	// 指定寬度爲1,即只使用4字節中的1位
  unsigned int b : 1;
} s1;

struct
{
  unsigned int a : 31;	// 指定寬度爲1,即只使用4字節中的1位
  unsigned int b : 1;
  unsigned int c : 1;
} s2;

cout << sizeof(s1);		// 結果爲:4
cout << sizeof(s2);		// 結果爲:8

對於s1,當使用這樣的變量小於32個時,結果都是4字節,因爲a、b各佔1位,不足4字節,需要字節補齊成4字節。

對於s2,a、b、c加在一起佔據33位,按照4字節對齊,結果是8字節。

特殊情況:
// 一、union聯合體,
// 1、其特性是整個union共用一個空間,即所有成員相對於基地址的偏移量都爲0
// 2、union的內存需要能存下其內最大的結構
// 3、同時union要按照字節寬度最大的結構進行字節對齊
typedef union DATE
{
	long i;
	int k;
	char c[11];
};
cout << sizeof(DATE) << endl;	// 結果是:12,最大空間要大於11,再按照4字節對齊,即爲12

// 結構體內包含union
struct data
{
	int cat;
	DATE cow;
	double dog;
};
cout << sizeof(struct data) << endl;	// 結果是24,此時按照double類型進行字節對齊
sizeof用法

sizeof有三種語法形式:

1sizeof (object);  // sizeof (對象),有無括號均可
2sizeof object; 
3sizeof (type_name);  //sizeof (類型)
實例
int a = 20;				// 類型
int arr[] = [1,2,3];	// 數組
char str[]="hello";
char* s = str;

int len_a = sizeof(a);		// 4,int類型
int len_arr = sizeof(arr);	// 12,sizeof(int) * 數組元素個數
int len_str = sizeof(str);	// 6,sizeof(char) * 數組元素個數
int len_s = sizeof(s);		// 4或8,指針類型,32位系統是4,64位系統是8
int len_d = sizeof(1 + 1.234);	// 先計算結果,然後對結果類型計算sizeof,等同於sizeof(double)
基本類型的sizeof值

常用的類型sizeof值如下所示:
主要區別:指針類型、long、unsigned long類型;

32位系統:
		指針			4
		bool			1
		char			1
		short			2
		int				4
		unsigned int	4
		long			4
		unsigned long 	4
		long long		8	      
		float	4
		double	8
64位系統:
		指針			8
		bool			1
		char			1
		short			2
		int				4
		unsigned int	4
		long			8
		unsigned long 	8
		long long		8
		float			4
		double			8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章