关于结构体的大小
在C++Builder下
struct test2{
int a;
char b;
};
sizeof(test2)为8
我想sizeof(test2)应该是5(int 是4,char 1)为什么它是的结果是8;
是不是c++和c计算结构的大小不一样的
问题点数:0、回复次数:16Top
1 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-01-03 09:36:15 得分 0
应该是编译器的问题吧Top
2 楼xpdavis(咕嘟-不想孤独)回复于 2005-01-03 09:40:17 得分 0
编译器做了对齐操作。Top
3 楼constantine(飘遥的安吉儿)回复于 2005-01-03 10:04:04 得分 0
bcb里面设置为Byte对齐就是5了
默认好像是Quad wordTop
4 楼h13bk(道人)回复于 2005-01-03 10:34:30 得分 0
project-options-advanced compiler-data alignment 设为byteTop
5 楼zsqat(强子)回复于 2005-01-03 10:58:48 得分 0
怎么设置Byte对齐,和Quad word对齐,我做的时候,什么都没动,按默认的,我看c语言上说的应该是各成员大小之和,为什么他好像是按最大的成员大小相加的
Top
6 楼zsqat(强子)回复于 2005-01-03 11:04:14 得分 0
#pragma pack(1)
struct test
{
int a;
char b;
};
Edit1->Text=sizeof(test);
#pragma pack()
这样设置的话就对了是5,#pragma pack(1)是啥意思?1是啥意思?Top
7 楼libbyliugang()回复于 2005-01-03 11:55:39 得分 0
sizeof(int)>=sizeof(char)
这里sizeof(int)==sizeof(char)
这是我的想法
Top
8 楼jishiping(JSP 季世平)回复于 2005-01-03 12:21:48 得分 0
#pragma pack(N)
这儿的N可以是1,2,4,8,N为1表示数据按BYTE对齐,就是说,变量在内存中的地址,可以是任何值。N表示,如果变量的占用的字节大小>=N时,它在内存中的地址,必须是N的整数倍。比如楼主这儿的结构,缺省情况下为DWORD对齐(N为4),第一个变量为int,它占用4个字节,所以a的地址必须为4的倍数,第二个变量为char,可以在任意位置,这样得到的结构大小为5,同时整个结构的大小,必须和结构的第一个变量的要求相同。这儿的第一个变量为int,按DWORD对齐地址是4的倍数,所以整个结构的大小也必须是4的倍数。Top
9 楼zsqat(强子)回复于 2005-01-03 15:11:31 得分 0
上面的1,2,4,8分别表示啥意思?Top
10 楼mygis2003(影子)回复于 2005-01-03 15:21:06 得分 0
1,2,4,8是对齐方式Top
11 楼zsqat(强子)回复于 2005-01-03 16:12:40 得分 0
1是按字节对齐,2,4,8各式按啥方式对齐的Top
12 楼tsk()回复于 2005-01-03 22:25:09 得分 0
用下面方法做就可以了!
#pragma pack(push,1)
struct test2{
int a;
char b;
};
#pragma pack(pop)
Top
13 楼jishiping(JSP 季世平)回复于 2005-01-04 13:04:15 得分 0
2 就是WORD对齐,4就是DWORD对齐,8就是QWORD对齐。还是以缺省的DWORD对齐来说明,在Win32下,int、long、float、double变量的地址必须为4的整数倍,WORD变量的地址必须是2的整数倍,char、BYTE可以在任何地址上。Top
14 楼zsqat(强子)回复于 2005-01-04 13:22:58 得分 0
我们定义变量时,是不是Byte相当于char,word相当short int,dword相当于int,qword相当于long?Top
15 楼jishiping(JSP 季世平)回复于 2005-01-04 22:27:11 得分 0
BYTE 就是 unsigned char (和char相比,只是有没有符号而已)
WORD 就是 unsigned short int (和short int相比,只是有没有符号而已)
DWORD 就是 unsigned long int (win32中long的长度为4,64位下long的长度为8)
QDWORD 为8个字节,C、C++中只有double、long double、long long int、__int64 几个类型 >= 8Top
16 楼zsqat(强子)回复于 2005-01-05 08:19:31 得分 0
在此,太感谢季世平对我的帮助,支持!Top




