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个字节。
};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为sizeof(double)=8的倍数。
所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。
聊天记录:
truct A {
double d;
char c;
DWORD dw;
LONGLONG ll;
int i;
}; 如果不用 pack(1); 你看看默认长度是多少?
问 2014-12-05 11:17:53
我试一下
答 2014-12-05 11:18:27
char[12], 不是12对齐,是char对齐
答 2014-12-05 11:18:56
你先认为是多少?
答 2014-12-05 11:19:07
上面结构长度
2014-12-05 11:19:32
问 2014-12-05 11:19:32
40?
答 2014-12-05 11:19:36
struct A {
double d;
char c;
DWORD dw;
LONGLONG ll;
WORD w;
}; 如果不用 pack(1); 你看看默认长度是多少?
问 2014-12-05 11:19:49
40?
答 2014-12-05 11:20:08
你用程序sizeof一下
答 2014-12-05 11:20:32
再加上pack(1), sizeof一下
问 2014-12-05 11:20:36
32
问 2014-12-05 11:20:49
为什么是32呢
问 2014-12-05 11:20:53
不是40吗?
答 2014-12-05 11:20:53
怎么不是40?
答 2014-12-05 11:21:15
你怎么说是40?
2014-12-05 11:21:29
问 2014-12-05 11:21:29
5个字段呀,每个按最长对齐,应该5*8呀
答 2014-12-05 11:22:06
对齐方式不是这种概念
问 2014-12-05 11:22:20
不是以LONGLONG?是以DWORD?
问 2014-12-05 11:22:23
噢
答 2014-12-05 11:22:32
struct A {
double d;
char c;
DWORD dw;
LONGLONG ll;
WORD w1;
WORD w2;
};
答 2014-12-05 11:22:56
你认为这个是48字节?
答 2014-12-05 11:23:05
还是32
问 2014-12-05 11:23:21
啊?为什么呢?
2014-12-05 11:23:47
问 2014-12-05 11:23:47
对齐我理解错了?
答 2014-12-05 11:24:10
struct A {
double d;
char c1;
byte b1;
DWORD dw;
LONGLONG ll;
WORD w1;
WORD w2;
};
答 2014-12-05 11:24:21
还是32字节
2014-12-05 11:24:40
答 2014-12-05 11:24:40
struct A {
double d;
char c1;
byte b1;
DWORD dw;
LONGLONG ll;
WORD w1;
WORD w2;
};
答 2014-12-05 11:24:52
我解析最后一个
问 2014-12-05 11:25:03
这就搞不懂了
答 2014-12-05 11:25:08
double是8字节
问 2014-12-05 11:25:18
嗯
问 2014-12-05 11:25:27
其它的不是向他靠吗?
答 2014-12-05 11:25:42
c1是char 字节对齐,在第9个位置
问 2014-12-05 11:26:17
这个不理解
答 2014-12-05 11:26:23
b1也是字节对齐,在第10个位置
问 2014-12-05 11:26:27
他放在第9个位置我知道
2014-12-05 11:27:07
答 2014-12-05 11:27:07
结构是以字段变量对对齐
答 2014-12-05 11:27:58
dw是4字节对齐,因为前面只用了10字节,所以在12字节开始
答 2014-12-05 11:29:06
dw 和 b1之间有二个字节是空的,你在b1后再加WORD, 或者二个字节字符,都不影响dw的位置
2014-12-05 11:30:04
答 2014-12-05 11:30:04
ll,因为正好是16开始,所以ll和dw之间没有空
答 2014-12-05 11:30:29
同理w1 在20, w2在22
答 2014-12-05 11:30:59
不是20,是25, 27
答 2014-12-05 11:31:14
从1开始
问 2014-12-05 11:31:31
我得好好理解
2014-12-05 11:31:37
答 2014-12-05 11:31:37
24,26
答 2014-12-05 11:32:30
结构总长度,必须是其中最长字段的倍数,所以w2后,还有4个空字节
答 2014-12-05 11:33:06
你不理解对齐方式,就不能定协议
问 2014-12-05 11:33:36
噢,等我理解一下
2014-12-05 11:34:04
答 2014-12-05 11:34:04
你可以看每个变量的地址,
问 2014-12-05 11:34:25
我把你上面的结都写成结构看了,确实都是32
2014-12-05 11:35:00
问 2014-12-05 11:35:00
怎么看地址变量?
问 2014-12-05 11:36:28
"结构总长度,必须是其中最长字段的倍数"是遇到的最长字段为准吧,不是总体最长是吧?
答 2014-12-05 11:36:34
变量前好象有地址吧,没有就添加监视,&(A.w1)
问 2014-12-05 11:36:56
噢,我看一下
2014-12-05 11:37:35
问 2014-12-05 11:37:35
要赋值才行吧?
答 2014-12-05 11:37:35
上面解析了w2后为什么有4个空字节
答 2014-12-05 11:37:53
就是结构总长度
答 2014-12-05 11:38:29
不用,但必须有实例
答 2014-12-05 11:38:39
new 一个
问 2014-12-05 11:38:47
int alen=sizeof(A);
int blen=sizeof(B);
int clen=sizeof(C);
int dlen=sizeof(D);
int elen=sizeof(E);
问 2014-12-05 11:38:51
噢
问 2014-12-05 11:39:02
new 个对象?
答 2014-12-05 11:39:10
是
问 2014-12-05 11:39:16
好的
2014-12-05 11:39:47
答 2014-12-05 11:39:47
只有分配对象,才能有内存,才能看地址
问 2014-12-05 11:40:00
噢
问 2014-12-05 11:40:08
A aobj=new A();
这样吗?
问 2014-12-05 11:40:28
我去吃饭,他们这里现在必须吃饭
答 2014-12-05 11:40:29
A*
问 2014-12-05 11:41:03
好的,讲解的,给我留一下言,谢谢
答 2014-12-05 11:41:07
或者是临时变量,都可以
答 2014-12-05 11:41:44
那边是不是很冷,江工和你什么时候回来
2014-12-05 12:07:27
问 2014-12-05 12:07:27
现在是比较冷了
2014-12-05 12:07:31
问 2014-12-05 12:07:31
江工回去了呀
问 2014-12-05 12:07:38
他没有到公司?
2014-12-05 12:12:22
答 2014-12-05 12:12:22
他昨天回来的?
12:21:42
问 2014-12-06 12:21:42
struct B {
double d;
char c1;
byte b1;
DWORD dw;
LONGLONG ll;
WORD w1;
WORD w2;
};
sizeof(B)=32
我是这样理解的你看对不对:
1、结构体每个成员相对于结构体首地址的偏移量都是此成员大小的整数倍,也就是以这个成员的长度去除前面的成员的总长度(含填补的字节),如果除得整数,即取模为0,那么就放在这个地址。所以b1和dw之间才会需要补充两个字节的空位。
2、总长度为最长成员长度的整数倍。由于这个规则,上面B的字节总数,算上补齐字节,到w2完成后只有28个字节,但是sizeof得出的结果是32,由于28不是成员最长成员的8的的整数倍,所以再补4个字节才能整除,所以是32。