关于sizeof的那些事

sizeof的用途是计算数据空间的字节数

常见内置类型的sizeof

 short2
 int4
 long4
 float4
 double8
 char1
 void*4
 WORD2
 DWORD4
 enum4

类类型的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/

转载于:https://www.cnblogs.com/Linkabox/p/3355480.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值