关于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/

posted @ 2013-10-07 15:01  Linka  阅读(261)  评论(0编辑  收藏  举报