The C++ compiler
aligns data structures to the largest alignment required by any field (8 bytes in the case below, due to
double
). This ensures faster memory access, as modern CPUs perform better when data is aligned to specific boundaries because it results in single memory word access. As a side effect,
sizeof(MyStructure)
(40 bytes due to padding) is larger than the sum of individual fields (33 bytes).
Field Offsets and Padding
int i1
:
- Requires 4-byte alignment.
- Starts at offset
0
.
- Takes
4 bytes
.
- The next field,
d1
, requires 8-byte alighment. Since i1
ends at offset 4
, the compiler adds 4 bytes of padding after i1
.
double d1
:
- Requires 8-byte alignment.
- Starts at offset
4 + 4 = 8
. - Takes
8 bytes
.
char s[9]
:
- Requires no specific alignment (1-byte alignment is sufficient).
- Starts at offset
16
(immediately after d1
).
- Takes
9 bytes
.
- The next field,
int i2
, requires 4-byte alignment. Therefore, the compiler adds 3 bytes of padding after s
to ensure proper alignment.
int i2
:
- Requires 4-byte alignment.
- Starts at offset
28
.
- Takes
4 bytes
.
double d2
:
- Requires 8-byte alignment.
- The next offset must be a multiple of 8. Since
i2
ends at offset 32
(already aligned), no padding is required.
- Starts at offset
32
.
- Takes
8 bytes
.
No comments:
Post a Comment