C/C++ 复习 struct和union的区别;struct的字节对齐;union所占内存大小

本文从WordPress迁移而来, 查看全部WordPress迁移文章

一:struct和union的区别

struct,相互关联的元素的集合,每个元素都有自己的内存空间;每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序;一个struct所占的总的内存大小,并不是各个元素所占空间之和,而是存在字节对齐的问题

union,它所有的元素共享同一内存单元,且分配给 union 的内存空间由类型最大的元素 size 来确定

因此在使用union时容易犯的错误就是,给一个union的多个元素赋值;由于共享内存,最后的赋值会覆盖前面所有的值,实际上只对最后的元素赋值

二:struct字节对齐问题(gcc编译器)

每个元素相对于结构体的首地址的偏移量能被该元素的size整数;如果该元素size>4,则偏移量能被4整除即可

另外struct的总size并没有严格为4或8的倍数;不过这个问题还是跟编译器和平台有关,如果知道(也可以编译器设置)参数信息,要计算出来不难

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <cstdio>
#include <iostream>
using namespace std;
#define LL long long

struct E1 {
int a; char b; char c;
}e1;

struct E2 {
char b; int a; char c;
}e2;

struct E3 {
char a; short b; int c; LL d;
}e3;

struct E4 {
int c; LL d; char a; short b;
}e4;

struct E5 {
char a1,a2,a3,a4,a5,a6;
}e5;
struct E6 {
char a1,a2,a3;
}e6;
struct E7 {
struct E5 elem5;
struct E6 elem6;
LL a;
}e7;

struct E8 {
char a[9];
}e8;
struct E9 {
struct E8 elem8;
LL a;
}e9;

struct E10 {
char a;
};

int main() {
puts("E1");
cout << sizeof(E1) << endl;
printf("%x %x %x %x\n", &e1, &e1.a, &e1.b, &e1.c);

puts("E2");
cout << sizeof(E2) << endl;
printf("%x %x %x %x\n", &e2, &e2.b, &e2.a, &e2.c);

puts("E3");
cout << sizeof(E3) << endl;
printf("%x %x %x %x %x\n", &e3, &e3.a, &e3.b, &e3.c, &e3.d);

puts("E4");
cout << sizeof(E4) << endl;
printf("%x %x %x %x %x\n", &e4, &e4.c, &e4.d, &e4.a, &e4.b);
puts("E5");
cout << sizeof(E5) << endl;
puts("E6");
cout << sizeof(E6) << endl;
puts("E7");
cout << sizeof(E7) << endl;
printf("%x %x %x %x\n", &e7, &e7.elem5, &e7.elem6, &e7.a);

puts("E8");
cout << sizeof(E8) << endl;
puts("E9");
cout << sizeof(E9) << endl;

puts("E10");
cout << sizeof(E10) << endl;
return 0;
}