首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么这个sizeof()=24,该如何解决

2012-02-09 
为什么这个sizeof()24structMyStruct{charddadoubledda1inttypeshortduan}voidmain(){cout sizeo

为什么这个sizeof()=24
struct   MyStruct
{
        char   dda;
        double   dda1;
        int   type   ;
        short   duan   ;
};
void   main()
{
        cout < <sizeof(MyStruct) < <endl   ;
        system( "pause ")   ;
}
//
我觉得应该是   1+8+4+2=15  
就算数据对齐的话最多也就是16,怎么结果会是24呢

[解决办法]
struct MyStruct

{

char dda;//偏移量为0,满足对齐方式,dda占用1个字节;

double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8

//的倍数,需要补足7个字节才能使偏移量变为8(满足对齐

//方式),因此VC自动填充7个字节,dda1存放在偏移量为8

//的地址上,它占用8个字节。

int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍

//数,满足int的对齐方式,所以不需要VC自动填充,type存

//放在偏移量为16的地址上,它占用4个字节。

short duan ;};//下一个可用的地址的偏移量为20,是sizeof(short)=2的倍
//数,满足short的对齐方式,所以不需要VC自动填充.
//所有成员变量都分配了空间,空间总的大小为1 7 8 4 2=22,不是结构

//的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof 字串2

//(double)=8)的倍数,所以需要填充2个字节,以满足结构的大小为

//sizeof(double)=8的倍数。
[解决办法]
运行一下这个代码就知道那个占多大了
struct MyStruct
{
char dda;
double dda1;
int type ;
short duan ;
};
int main(int argc,char* argv[])
{
cout < <sizeof(MyStruct) < <endl ;
cout < <offsetof(MyStruct,dda) < <endl ;
cout < <offsetof(MyStruct,dda1) < <endl ;
cout < <offsetof(MyStruct,type) < <endl ;
cout < <offsetof(MyStruct,duan) < <endl ;
return 0;
}
[解决办法]
如果如下的写法,就会使LZ想要的结果15

#include <iostream>
#include <string>
using namespace std;
#pragma pack(push) //保存对齐状态
#pragma pack(1)

struct MyStruct
{
char dda;
double dda1;
int type ;
short duan ;
};

#pragma pack(pop)

int main(int argc,char* argv[])
{
cout < <sizeof(MyStruct) < <endl ;
return 0;
}
[解决办法]
struct MyStruct
{
char dda;
double dda1;
int type ;
short duan ;
};

我想知道什么情况下 sizeof(MyStruct)==24 ?

热点排行