差不多的结构体,差别如何这么大呀
差不多的结构体,差别怎么这么大呀?
typedef struct
{
char regAddr;
double regValue;
char regMast;
}reg_A;
typedef struct
{
char regAddr;
char regMast;
double regValue;
}reg_B;
在实际的程序中,我发现:sizeof(reg_A)=24,sizeof(reg_B)=16,
不明白,谁知道这是怎么回事!不懂!请教了!
------解决方案--------------------
猜想与对齐方式有关!
从LZ给出的数据,一个double型应该是占8个字节(不知道对不对?)。
楼主可以去看各个成员的地址空间开始值是不是8的整数倍?
将各个成员的地址空间开始值分析一下,就会有结果的。
------解决方案--------------------
你似乎没有把相关内容全部写出来,你的代码中有没有pack宏?
------解决方案--------------------
楼主上网查一下 sizeof 一个struct时要考虑的东西就行了,
这是很成熟的了。
一个是成员的对齐,
一个是结构总大小是最大成员的大小的部数
------解决方案--------------------
http://hi.baidu.com/amateurlee/blog/item/18dbbb996d7823096f068c1f.html
这个文章讲的比较明白。个人认为。不是我写的哦
------解决方案--------------------
编译器为了访问方便,会对齐。VC默认为8字节对齐。如果结构中最大成员变量占用字节少于他,以结构中最大成员变量的字节数对其。CHAR 为1,DOUBLE为8。就以8为准。
reg_a :
char regAddr占用一个字节。位于字节0处。
double regValue;占用8个字节。因为DOUBLE 类型对齐字节数为8.为了访问方便,放在8的倍数处。存放位置 为
8-15。1-7的字节处系统补齐。其实啥也没有。
char regMast占用一个字节。位于16处。
最后由于结构本身需要对齐,当多个结构变量连续存储的时候方便访问,结构对其字节数为结构中最大成员变量占用字节。
所以sizeof(reg_A)=8+8+8=24。
reg_B:
char regAddr; 占用1个字节。放于位置0;
char regMast; 启示位置1,刚好为CHAR 的倍数,就放在位置1。占用一个字节
double regValue; 下一个字节位置2不是8的倍数,2-7补齐,放于8-15处。到此共用了16个字节。
由于regValue的下个存储位置16,刚好是double类型的倍数,所以不用往后补齐。共占用16字节。所以sizeof(reg_B)=1+1+6+8=16。
解释的不是很全,建议楼主上网搜下结构对齐方面的知识。
typedef struct
{
char regAddr;
double regValue;
char regMast;
}reg_A;
typedef struct
{
char regAddr;
char regMast;
double regValue;
}reg_B;
在实际的程序中,我发现:sizeof(reg_A)=24,sizeof(reg_B)=16,
不明白,谁知道这是怎么回事!不懂!请教了!
------解决方案--------------------
猜想与对齐方式有关!
从LZ给出的数据,一个double型应该是占8个字节(不知道对不对?)。
楼主可以去看各个成员的地址空间开始值是不是8的整数倍?
将各个成员的地址空间开始值分析一下,就会有结果的。
------解决方案--------------------
你似乎没有把相关内容全部写出来,你的代码中有没有pack宏?
------解决方案--------------------
楼主上网查一下 sizeof 一个struct时要考虑的东西就行了,
这是很成熟的了。
一个是成员的对齐,
一个是结构总大小是最大成员的大小的部数
------解决方案--------------------
http://hi.baidu.com/amateurlee/blog/item/18dbbb996d7823096f068c1f.html
这个文章讲的比较明白。个人认为。不是我写的哦
------解决方案--------------------
编译器为了访问方便,会对齐。VC默认为8字节对齐。如果结构中最大成员变量占用字节少于他,以结构中最大成员变量的字节数对其。CHAR 为1,DOUBLE为8。就以8为准。
reg_a :
char regAddr占用一个字节。位于字节0处。
double regValue;占用8个字节。因为DOUBLE 类型对齐字节数为8.为了访问方便,放在8的倍数处。存放位置 为
8-15。1-7的字节处系统补齐。其实啥也没有。
char regMast占用一个字节。位于16处。
最后由于结构本身需要对齐,当多个结构变量连续存储的时候方便访问,结构对其字节数为结构中最大成员变量占用字节。
所以sizeof(reg_A)=8+8+8=24。
reg_B:
char regAddr; 占用1个字节。放于位置0;
char regMast; 启示位置1,刚好为CHAR 的倍数,就放在位置1。占用一个字节
double regValue; 下一个字节位置2不是8的倍数,2-7补齐,放于8-15处。到此共用了16个字节。
由于regValue的下个存储位置16,刚好是double类型的倍数,所以不用往后补齐。共占用16字节。所以sizeof(reg_B)=1+1+6+8=16。
解释的不是很全,建议楼主上网搜下结构对齐方面的知识。