读书人

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

发布时间: 2012-02-09 18:22:27 作者: rapoo

为什么这个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 ?

读书人网 >C++

热点推荐