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有三種語法形式:
1) sizeof (object); // sizeof (對象),有無括號均可
2) sizeof object;
3) sizeof (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