问题如下:
struct A
{
double a;
int b;
int c;
int d;
double e;
}则struct A应该为28字节,但是sizeof(A)却为32字节,请问各位高手,这是什么问题引起的?
struct A
{
double a;
int b;
int c;
int d;
double e;
}则struct A应该为28字节,但是sizeof(A)却为32字节,请问各位高手,这是什么问题引起的?
sizeof(int)=4
12+4+4+4+12=32
接分:)
注意这样,对于CPU来说,存取起来效率更高
#pragma pack(push, 1)
使用完,再恢复就可以了.
#pragma pack(push, 8)
在结构体中,是按最大的sizeof()值*结构体的成员个数,你定义的结构体中,最大的sizeof()值为:
sizeof(float)=8;成员个数为5,值应该为40吧.
不是ms的bug
double a; -------8字节
int b;--------____8字节
int c;--------
int d;------------8字节
double e; -------8字节8 + 8 + 8 + 8 = 32 用wxdvc(csdn)的方法可避免这个
不同机子的float可能不同的,我的机子sizeof(float)=4;
那整型来说,对不同的编译器,他的存储位数是不同的。有2byte,有4byte的。对于32位机器来说,现在大都是4byte.
所以你得出的就是32了
字节对齐问题,改为以下代码看看,结果将会与你预测的一样!
#pragma pack(push,MyStruct,1)
struct A
{
double a;
int b;
int c;
int d;
double e;
}
#pragma pack(pop,MyStruct,1)
http://community.csdn.net/Expert/topic/3710/3710448.xml?temp=.3791468
寒一下一楼的 RockHwnd,12+4+4+4+12 = 32????晕了吧!
抢分也不要太激动了啊!
呵呵,无恶意的说!
struct A
{
double a; ==8
int b;
int c; ==8
int d;
double e; == 8+8
}==32说明:int d;
double e; == 8+8
因为int + double =12 ,编译器默认为8字节对齐,所以就会在后面补4位,你可以直接看内存,马上就一清二楚了。加上这个#pragma pack(1),就会以1字节对齐,就是你的预期结果,不信你可以再弄别的结构体尝试一下。也可以直接设置,Project Setting -> C/C++ ->Code Generation -> Struct Menber Axxx....
#pragma pack(1)typedef struct
{
unsigned int Total_Length; //消息总长度(含消息头及消息体)
unsigned int Command_Id; //命令或响应类型
unsigned int Sequence_Id; //消息流水号,顺序累加,步长为1,
//循环使用(一对请求和应答消息的流水号必须相同)
}cmpp_head;typedef struct
{
char Source_Addr[6]; //源地址,此处为SP_Id,即SP的企业代码。
char AuthenticatorSource[16];//用于鉴别源地址。
//其值通过单向MD5 hash计算得出,表示如下
//AuthenticatorSource =MD5(Source_Addr+9 字节的0 +shared secret+timestamp)Shared secret 由中国移动与源地址实体事先商定,timestamp格式为:MMDDHHMMSS,即月日时分秒,10位。
BYTE Version; //双方协商的版本号
unsigned int Timestamp; //时间戳的明文
}cmpp_connect_body;....#pragma pack(pop)
***********************
以上就是我的程序里使用的结构对齐方法. 这样使用后就是你使用sizeof加起来的实际值.写网络通信程序用到结构的,一般都必须考虑结构对齐问题.
{
double a;
double e;
int b;
int c;
int d;
}
字节对齐的问题,写成这样就是28了。
默认按照 第一个 double 的8字节对齐,两个int用8字节。一个为了对齐也得 8字节 ,4字节浪费掉
double a; -------8字节
int b;--------____8字节
int c;--------
int d;------------8字节
double e; -------8字节8 + 8 + 8 + 8 = 32 用wxdvc(csdn)的方法可避免这个
{
my();
}sizeof(my)==1;//虽然没有成员变量,类大小还是为1很多东西都不是如我们想象的那样
up
point :)