struct s11
{
alignas(16) char s;
int i;
};
does
alignas(n) X xmean it would allocate n bytes to hold aX, whenXis actually much smaller than n bytes, the rest memory would be all 0s?when
s11.sis in memory0x0, does that means11.iwould be at0x10? However, the followingpdiffis0x4
s11 o;
ptrdiff_t pdiff = (char*)&o.i - (char*)&o.s;
- Please explain why
sizeof(s11)is not 16 times 2, whilesizeof(s1)is 8 times 3?
struct s1
{
char s;
double d; // alignof(double) is 8.
int i;
}
EDIT: This is what I found after a lot of digging and code snippets, that how alignas affect struct(class) size.
alignas(n) X x means in memory x is located at a place with an offset of multiple of n bytes, starts from 0x00. Therefore, s11.s can be located at 0x00, 0x10, 0x20 and so on. Because s11.s is the first field, it is at 0x00, and it is a char, so it ocupies 1 bytes.
So is the 2nd field. int has an align 4, therefore it can be located at 0x00, 0x04, 0x08, 0x0c, etc. Because the first byte is taken by s11.s, so s11.i is located at 0x04.
CodePudding user response:
when alignof operator used in struct does it affect sizeof
You aren't using alignof operator. You're using alignas specifier.
Using alignas specifier doesn't necessarily affect the size of a class, but it can affect it.
- does alignas(n) X x mean it would allocate n bytes to hold a X, when X is actually much smaller than n bytes, the rest memory would be all 0s?
No. If there is padding, there's no guarantee that it would be all 0s. Furthermore, there are cases where the memory can be occupied by other members.
- when s11.s is in memory 0x0, does that mean s11.i would be at 0x10?
No.
- Please explain why sizeof(s11) is not 16 times 2
Probably because it doesn't need to be. Here is an example layout that would satisfy the alignment requirements:
offset member alignment offset % alignment must equal 0
0 s 16 0 % 16 == 0
1 padding
2 padding
3 padding
4 i 4 4 % 4 == 0
5 i
6 i
7 i
8 padding
9 padding
10 padding
11 padding
12 padding
13 padding
14 padding
15 padding
---
super alignment 16 16 % 16 == 0
while sizeof(s1) is 8 times 3?
Here is an example layout that would satisfy the alignment requirements:
offset member alignment offset % alignment must equal 0
0 s 1 0 % 1 == 0
1 padding
2 padding
3 padding
4 padding
5 padding
6 padding
7 padding
8 d 8 8 % 8 == 0
9 d
10 d
11 d
12 d
13 d
14 d
15 d
16 i 4 16 % 4 == 0
17 i
18 i
19 i
20 padding
21 padding
22 padding
23 padding
---
super alignment 8 24 % 8 == 0
My examples apply to a system where double is 8 bytes and int is 4.
CodePudding user response:
No, it means the starting address of the member
smust be aligned on a 16-byte boundary. Probably in the case of it being the first member of a struct, this will result in the struct itself adopting that alignment and not affecting the size.No, there is no specified alignment pertaining to the member
i, so normal alignment rules apply. If you're getting4then your system is using integers that have a size of 4 bytes, and are similarly aligned. The value of padding bytes is unspecified.The first explanation is in my answer to #2. Follow-up incorporting the answer to #1, the size will probably be 16 due to the required structure alignment. And
sizeof(s1)is 8 times 3 because of the alignment requirements of thedoublemember causing padding elsewhere, combined with the entire structure's alignment. Moving thecharmember to the end of the structure will reduce the total size.
