关于sizeof的那些事
sizeof的用途是计算数据空间的字节数
常见内置类型的sizeof
short | 2 | |
int | 4 | |
long | 4 | |
float | 4 | |
double | 8 | |
char | 1 | |
void* | 4 | |
WORD | 2 | |
DWORD | 4 | |
enum | 4 |
类类型的sizeof
1.空类,sizeof值为1,编译器隐含添加一字节,告诉有这样一个空类。
2.不带虚函数的类,sizeof值即为内部变量的sizeof值相加
3.带虚函数的类,sizeof值=内部变量+一个指向虚函数的指针(vptr)
4.子类的sizeof值
public继承时=子类内部变量+父类的大小
virtual继承时就比较复杂了,结果=虚基类的大小+子类内部变量(若子类存在虚函数还需加上vptr的值)
struct类型的sizeof
这里涉及到了struct的对齐方式
struct s1 { char a; double b; int c; char d; }; struct s2 { char a; char b; int c; double d; }; cout<<sizeof(s1)<<endl; // 24 cout<<sizeof(s2)<<endl; // 16
可以看出同样是两个char,一个int,一个double,但不同的对齐方式,导致他们的大小不同。
union与struct的空间计算遵循两个原则:设最大成员类型所占字节数为x,例如常见的double为8
(1)整体空间是占用空间x的整数倍
(2)数据对齐原则----按顺序放入大小为x的箱子中,一旦放满或不够放另起一个箱子再放。
所以使用位域时,最好把float类型和double类型放到struct的开头或结尾。
对于union与struct不同在于union的各成员变量共同占用一个存储空间,所以最大的成员变量即为它sizeof的值。
struct s1 { int i: 8; int j: 4; double b; int a:3; }; struct s2 { int i; int j; double b; int a; }; struct s3 { int i; int j; int a; double b; }; struct s4 { int i: 8; int j: 4; int a:3; }; cout<<sizeof(s1)<<endl; // 24 cout<<sizeof(s2)<<endl; // 24 cout<<sizeof(s3)<<endl; // 24 cout<<sizeof(s4)<<endl; // 4
参考文章:
http://www.cnblogs.com/chengxin1982/archive/2009/01/13/1374575.html
http://blog.163.com/zhaoxin851055@126/blog/static/81129298200981110253605/