我晕死了,struct占内存大小的问题

toumao 2005-10-18 11:11:17
struct A
{
char a;
int b;
int c[5];
};
struct B
{
char a;
char b[5];
int c;
};
以上两个struct占字节的大小分别是28和12,
其中12我能理解,是字节对齐的结果,
但是28是哪来的?无论内存是否对齐都不应该出现这个值啊?
...全文
219 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
niefuhua 2005-10-19
  • 打赏
  • 举报
回复
up
toumao 2005-10-19
  • 打赏
  • 举报
回复
嗯,我就是直接把struct内存地址发送出去的。
比如:
struct A
{
char i;
char j;
char k;
};
A a;
a.i=1; a.j=2; a.k=3;
Send(&a, sizeof(A));//发送
如果我不使用对齐,那么就成了:
Send(&a, 3);
对方调用Receive应该是这样的:
A *p = new A();
Receive(p, sizeof(A));//sizeof()结果不一定是3字节
cout<<p->i<<p->j<<p->j<<endl;//无法解释
goodluckyxl 2005-10-19
  • 打赏
  • 举报
回复
说“肯定不会出错”我就不明白了,
我这儿单字节对齐了,
struct A
{
char i;
char j;
char k;
};
一共只占三个字节,
发送到对方,
对方如果使用4字节对齐,他怎么解释我发给他的内容呢?
//这种情况是不会出意外的
//如果协议解释按成员来访问不是简单结构拷贝是不会出问题的
//一般规约通讯处理都是不对齐设置来做 32位机效率有影响但不大
hjunxu 2005-10-19
  • 打赏
  • 举报
回复
我的一个顾虑是:我编的程序是用来跟中国联通互联进行短信收发的,
SGIP协议从头到尾没有提要不要字节对齐,
那么,我这边该怎么办呢?
是不是按qinxiaogang(qinxg)所言,
凡是通信程序都约定为单字节对其呢
---------------------------------------
搂主你多虑了吧。

包都是有长度的,单位一般来说都是1个byte,和你程序的字对齐没有关系。
除非你在发送的时候是直接把struct强制转换成内存来法,收的时候直接把内存转换成struct。

hzyyxx 2005-10-19
  • 打赏
  • 举报
回复
每次定义struct的时候建议采用这样的方式
#pragma pack(1)
struct ...
{
}
struct ...
{
}
#pragma pack()
让系统强制对齐方式,这样就比较方便了呀
goodluckyxl 2005-10-18
  • 打赏
  • 举报
回复
看我最后一个回复告诉你在那种情况下可能回出错
goodluckyxl 2005-10-18
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4324/4324625.xml?temp=.4367029
lxpws 2005-10-18
  • 打赏
  • 举报
回复
分析了一下,感觉应该是这样的:对齐是为了照顾数据类型跨过读取边界的情况(读取的最小单位是16位,2个字节来吧?),如int分两个short读取,short分两个byte读取等,所以如果数据类型不能跨越边界(即长度<2,如byte,char,uchar)则不会对其优化。所以当结构中有short,int等>=2长度的类型时才会优化。
goodboyws 2005-10-18
  • 打赏
  • 举报
回复
默认8bytes,呵呵
oyljerry 2005-10-18
  • 打赏
  • 举报
回复
默认4bytes,可以在设置中设置的
once168 2005-10-18
  • 打赏
  • 举报
回复
更复杂一点的:
struct A
{
char a;//2.由于下面b的以占用了一组,虽然a只有一个字节,根据第二个原则,要补齐,占用一组,4个字节
int b;//1.首先安第一个原则,这个必须为一组,4个字节
struct{
unsigned bit0:1;
unsigned bit2_3:2;
unsigned bit3_7:4;
}flag; //这个属性结构,所有位加起来正好是1字节,但根据原则2,这个也可对齐,即采用4个字节

int c[5];//3.这正好是4的倍数,20字节
};
这样将是:32字节
once168 2005-10-18
  • 打赏
  • 举报
回复
VC++究竟是什么时候使用字节对齐,什么时候不使用?

VC的字节对齐方法采用的是组对齐方法,这与系统的总线的使用方法相同,所以采用与总线同宽的对象对齐位效率最高,现在都是32位系统,所以默认均是32位对齐.
即:将每连续几个变量作为一组
下面以32位对齐为例
若这一组对象是4或4的倍数,则自接使用,若不是则要采用对象,对齐原则有:
1.若对象变量本身长度就是4或4的倍数,这种情况必须保证此变量为一组(即占用所有数据总线位)
2.其它情况就要对连续的对象进行分组,不能成为4的倍数的对象就必须填满为4个字节
3.整个结构也必须是4的倍数,不够也要补齐

//下面是你的代码进行解释
struct A
{
char a;//2.由于下面b的以占用了一组,虽然a只有一个字节,根据第二个原则,要补齐,占用一组,4个字节
int b;//1.首先安第一个原则,这个必须为一组,4个字节
int c[5];//3.这正好是4的倍数,20字节
};
所以是4+4+20=28字节
同理,其它情况都是这样计算的


菜牛 2005-10-18
  • 打赏
  • 举报
回复
说的当然是双方约定好的才叫协议。
菜牛 2005-10-18
  • 打赏
  • 举报
回复
如果对方这么变态,只要收到你的信息就返回错误就行了,根本不用判断。
toumao 2005-10-18
  • 打赏
  • 举报
回复
说“肯定不会出错”我就不明白了,
我这儿单字节对齐了,
struct A
{
char i;
char j;
char k;
};
一共只占三个字节,
发送到对方,
对方如果使用4字节对齐,他怎么解释我发给他的内容呢?
菜牛 2005-10-18
  • 打赏
  • 举报
回复
单字节对齐肯定不会出错,就是效率的影响,也不大。
Featured 2005-10-18
  • 打赏
  • 举报
回复
project-settings-c/c++ -到Category中选择codeGenerations-然后StructMemberAlignment选择1Bytes即可
toumao 2005-10-18
  • 打赏
  • 举报
回复
UINT_1 就是 unsigned char
toumao 2005-10-18
  • 打赏
  • 举报
回复
问题的来源是这样的,
VC++使用字节对齐我是一直知道的,
但是今天的编程中使用了这样的一个struct,发现它没有对齐:
struct TSGIP_Bind
{
UINT_1 LoginType;
char LoginName[16];
char LoginPassword[16];
char Reserve[8];
};
它的大小是41字节,就是直接相加的结果。
按照字节对齐的理论,不应该出现不能被4整除的大小。
但它就是41,
虽然在实际使用中我希望它就是41,(因为按SGIP协议要求必须这么大),
但是我不知其所以然。
toumao 2005-10-18
  • 打赏
  • 举报
回复
SORRY,是我搞错了,我想测试以下两个struct的。
struct A
{
char a;
int b;
char c[5];
};
struct B
{
char a;
char b[5];
int c;
};
分别是16和12。问题已解决。
不过这个问题的根源我没解决:
就是VC++究竟是什么时候使用字节对齐,什么时候不使用?
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧