struct 间的字节对齐,让我惊讶
问题的源来:
对这样的 struct:
struct X
{
short s;
int i;
long l;
};
在现在的 PC 中,sizeof (X) 应该是 12,那为什么在 8 字节对齐不是 16 呢?
进一步,我想到了 X 与 X 之间会是什么样子呢?
问题:
写了个检验的程序:
struct A
{
char a;
};
struct C
{
char a, b, c;
};
在 Dev-C++ 4.9.8.0(也就是 GCC 3.2)里,sizeof (A)==1,sizeof (C)==3。
我猜测,对:
A a1, a2; // 注:都在 main () 里
C c1, c2;
a1、a2,c1、c2 间的地址会差多少呢?本来我想,a1、a2 应该是差 1;而 c1、c2 应该是差 4 吧。结果在 Dev-C++ 里,a1 与 a2 是只相关 1,但 c1 与 c2 却相差了 16!!
于是我就扩大测试的范围,从 A 一直到 E:
#include <iostream>
#include <cstdlib>
using namespace std;
struct A
{
char a;
};
struct B
{
char a, b;
};
struct C
{
char a, b, c;
};
struct D
{
char a, b, c, d;
};
struct E
{
char a, b, c, d, e;
};
int
main ()
{
A a1, a2;
B b1, b2;
C c1, c2;
D d1, d2;
E e1, e2;
cout << sizeof (A) << endl;
cout << sizeof (B) << endl;
cout << sizeof (C) << endl;
cout << sizeof (D) << endl;
cout << sizeof (E) << endl;
cout << &a1 << " " << &a2 << endl;
cout << &b1 << " " << &b2 << endl;
cout << &c1 << " " << &c2 << endl;
cout << &d1 << " " << &d2 << endl;
cout << &e1 << " " << &e2 << endl;
system ("Pause");
return 0;
}
在 Dev-C++ 下的结果:
1
2
3
4
5
0x22ff67 0x22ff66
0x22ff64 0x22ff62
0x22ff48 0x22ff38
0x22ff34 0x22ff30
0x22ff18 0x22ff08
在 BCC 5.5 下的结果:
1
2
3
4
5
0012FF8B 0012FF8A
0012FF64 0012FF5E
0012FF55 0012FF4C
0012FF48 0012FF44
0012FF3C 0012FF34
在 VC6 下的结果:(命令行下编译,我没有打开任何开关)
1
2
3
4
5
0012FF60 0012FF54
0012FF50 0012FF7C
0012FF78 0012FF74
0012FF70 0012FF6C
0012FF64 0012FF58
GCC 3.2 的结果还好,只是空闲的多点;而 BCC 5.5 的结果让我看不懂了;最奇怪的是 VC6 的布局连次序都是乱的。
看来这个问题,对不同的编译器(和不同的设置)来说,差别太大了。
对于结果,我不知道分析了:(
还有如 A a[2]; B b[2]; 这样用数组又会有什么不同呢?
而 struct 内部也用 struct E { char e[5]; }; 也会不会有变呢?
困啊!睡觉去!