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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/* _Alignas and its interactions with sizeof */
#include <stdio.h>
#if __STDC_VERSION__ < 201100 && defined(__GNUC__)
#define _Alignas(x) __attribute__((aligned(x)))
#define _Alignof(x) __alignof__(x)
#endif
/* Base type */
int _Alignas(16) a;
char filler1;
/* Array */
_Alignas(16) int b[3];
typedef int int3[3];
_Alignas(16) int3 bb;
#if 0
typedef _Alignas(16) int int16;
int16 bbb[3];
#endif
char filler2;
/* Struct */
struct s {
char y;
int _Alignas(16) x;
};
struct s c;
char filler3;
struct s _Alignas(64) d;
char filler4;
/* Union */
union u {
int _Alignas(16) x;
char y;
};
union u e;
char filler5;
union u _Alignas(32) f;
char filler6;
/* Arrays of structs */
struct s g[3];
char filler7;
struct _Alignas(64) ss {
char y;
int _Alignas(16) x;
};
struct ss h[3];
char filler8;
/* Test harness */
int main()
{
printf("a: size = %u, alignment = %u, address mod 16 = %u\n",
(unsigned) sizeof(a), (unsigned) _Alignof(a), ((unsigned) &a) & 0xF);
printf("b: size = %u, alignment = %u, address mod 16 = %u\n",
(unsigned) sizeof(b), (unsigned) _Alignof(b), ((unsigned) &b) & 0xF);
printf("bb: size = %u, alignment = %u, address mod 16 = %u\n",
(unsigned) sizeof(bb), (unsigned) _Alignof(bb), ((unsigned) &bb) & 0xF);
#if 0
printf("bbb: size = %u, alignment = %u, address mod 16 = %u\n",
(unsigned) sizeof(bbb), (unsigned) _Alignof(bbb), ((unsigned) &bbb) & 0xF);
#endif
printf("c: size = %u, alignment = %u, address mod 16 = %u\n",
(unsigned) sizeof(c), (unsigned) _Alignof(c), ((unsigned) &c) & 0xF);
printf("d: size = %u, alignment = %u, address mod 64 = %u\n",
(unsigned) sizeof(d), (unsigned) _Alignof(d), ((unsigned) &d) & 0x3F);
printf("e: size = %u, alignment = %u, address mod 16 = %u\n",
(unsigned) sizeof(e), (unsigned) _Alignof(e), ((unsigned) &e) & 0xF);
printf("f: size = %u, alignment = %u, address mod 32 = %u\n",
(unsigned) sizeof(f), (unsigned) _Alignof(f), ((unsigned) &f) & 0x1F);
printf("g: size = %u, alignment = %u, address mod 16 = %u\n",
(unsigned) sizeof(g), (unsigned) _Alignof(g), ((unsigned) &g) & 0xF);
printf("h: size = %u, alignment = %u, address mod 64 = %u\n",
(unsigned) sizeof(h), (unsigned) _Alignof(h), ((unsigned) &h) & 0x3F);
return 0;
}
|