C++ sizeof問題

關於C++中類所佔的內存空間總結,見bluesky的文章:

http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html


阿里巴巴有一道筆試題,問sizeof(a)的大小

#pragma pack(2)
class A
{
int i;
union U
{
char buff[13];
int i;
}u;
void foo() {    }
typedef char* (*f)(void*);
enum{red, green, blue} color;
}a;

結果爲22,我們一步一步來分析:

#pragma pack(2)
class A
{
int i;
}a;

這時sizeof(a)爲4,因爲int爲4字節

#pragma pack(2)
class A
{
int i;
union U
{
char buff[13];
}u;
}a;

這時sizeof(a)爲18,因爲U爲13字節,int爲4字節,加起爲17字節,由於#pragma pack(2),由於int i的存在,要兩字節對齊,所以結果爲18。

#pragma pack(2)
class A
{
union U
{
char buff[13];
}u;
}a;

這時sizeof(a)爲13,因爲U爲13字節,而且不存在需要對齊的其他變量,所以結果就是13

#pragma pack(2)
class A
{
union U
{
char buff[13];
int i;
}u;
}a;

這時sizeof(a)爲14,因爲U爲14字節,U爲什麼是14字節?因爲雖然U中最大內存的變量爲buff爲13,但由於i的存在,需要字節對齊,因此U的大小爲14,如果#pragma pack(4)的話,則U爲16,即最近接的整數倍。

因此:

#pragma pack(2)
class A
{
int i;          //4
union U     //本應13,對齊後爲14
{
char buff[13];
int i;
}u;
void foo() {    }  //0
typedef char* (*f)(void*);  //0
enum{red, green, blue} color;//4
}a;

因此答案爲4+14+4=22.

如果#pragma pack(4),則答案爲4+16+4=24

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