jake1036

sizeof与结构体

 首先看微软实习生的一道选择题
  
#include <iostream>
 
using namespace std ;
 
struct A
 
{
     A() ;
    
~A() ;
     
int m ;
     
int n ;      
 }
 ;

  
struct B
 
{
     B() ;
    
~B() ;
     
int m ;
     
char s ;
     
static char ss ;     
 }
 ;

 
struct C
 
{
     C() ;
   
virtual ~C() ;
     
int m ;
     
char s ;
     
short n ;     
 }
 ; 

 
int main()
 
{
  cout
<<sizeof(A) ;
  cout
<<sizeof(B) ;
  cout
<<sizeof(C) ;
  cin.
get() ;
  
return 0 ;    
 }


 结果是 8 , 8 , 12 。有些惊奇吧。

2 造成这结果的主要原因是,结构体内的变量有着位对齐的机制。

 
(1)结构体变量的首地址应该能够被结构体内最宽的变量所整除。

 (2)结构体中每一个变量相对于首地址的位置都应该是成员大小的整数倍。
 
 (3)结构体的总大小应该为结构体中的最宽基本类型的整数倍。

   结构体A的中含有两个int类型变量,故其大小为8。
   结构体B中含有一个int 大小为4,一个char大小为1,但是应该最宽的成员来分配内存空间。故也为8.而不是所认为的5.
  另外static 的变量存储在全局变量中,SIZEOF(B)为在栈内存空间中,所以结构体中不会为static变量分配内存。
  结构体C中,int最宽,所以short和char均占有4个字节,故结果为12. 
 
 

 







posted on 2011-04-11 19:34 kahn 阅读(505) 评论(1)  编辑 收藏 引用

Feedback

# re: sizeof与结构体 2012-04-30 19:28 路人

错啦C中的排布是:

int m // 0-3 四字节
char s // 4 一字节
short n // 为了对齐,从6开始 6-7两字节
virtual ~C() // 虚函数表四字节

共十二字节  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理