什么時候會用到sizeof?
sizeof程序員筆試中常考題目,看似簡單的指令,其中埋了很多雷,要多注意以防傷及吾身。
sizeof:判斷數據類型長度符的關鍵詞。
數組char p[10] = “abcde”;
printf(“%d”,sizeof(p));
10
因為p是一個數組,含有10個char類型數據,所以返回10。
指針char *p1 =new char[10];
strcpy_s(p1,10,“abcde”);
printf(“%d”,sizeof(p1));
4
指針存放的是地址,由于32位機器的地址只要4個字節就可以表示了,所以指針的大小都是4。
字符串char a1[]=“abcde”;
char a2[]={'a','b','c','d','e'};
a1的sizeof返回6
a2的sizeof返回5
因為a1是字符串常量,會以“\0”結尾。
static變量class A
{
public:
static int a;
Int b;
}
sizeof(A)為4,因為stfatic屬于存在靜態存儲區,只會統計b的大小。
函數class A0
{
public:
void add(){};
}
sizeof返回1,空類的大小都為1。
class A0
{
public:
int i;
Void add(){};
}
返回4,int的數據長度。
虛函數class A1
{
public:
virtual void add(){};
}
返回4,虛函數的指針為4。
字節對齊需要滿足三條準則:
1、結構體變量的首地址能夠被其最寬的基本類型成員的大小所整除;
2. 結構體每個成員相對于結構體首地址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充字節;
3. 結構體的總大小為結構體的最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之后加入填充字節。
struct Ex1
{
short s1;
int i1;
char c1;
}
sizeof為12,2+2+4+1+3=12。
第二個2和最后一個3分別基于上述2、3準則添加。
struct ex2
{
char c1;
Short s1;
Int i1;
}
sizeof值為8;1+1+2+4=8