struct s11
{
alignas(16) char s;
int i;
};
Run Code Online (Sandbox Code Playgroud)
是否alignas(n) X x意味着它将分配 n 个字节来保存 a X,当X实际上远小于 n 字节时,其余内存将全为 0?
s11.s记忆中的 是什么时候0x0,是否意味着s11.i将会在0x10?然而,以下pdiff是0x4
s11 o;
ptrdiff_t pdiff = (char*)&o.i - (char*)&o.s;
Run Code Online (Sandbox Code Playgroud)
sizeof(s11)不是 16 乘以 2,而是sizeof(s1)8 乘以 3?struct s1
{
char s;
double d; // alignof(double) is 8.
int i;
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是我在大量挖掘和代码片段之后发现的,alignas 如何影响结构(类)大小。
alignas(n) X x 表示在内存中x位于偏移多个n字节的地方,从0x00开始。因此,s11.s可以位于0x00、0x10、0x20等位置。因为s11.s是第一个字段,位于 0x00,并且是一个 char,所以占用 1 个字节。
第二个字段也是如此。int其对齐位置为 4,因此可以位于 0x00、0x04、0x08、0x0c 等位置。因为第一个字节是由 占用s11.s,所以s11.i位于 0x04。
当在struct中使用alignof运算符时,它会影响sizeof
您没有使用alignof运算符。您正在使用alignas说明符。
使用alignas说明符不一定会影响类的大小,但它可以影响类的大小。
- alignas(n) X x是否意味着它会分配n个字节来保存X,当X实际上比n个字节小得多时,其余内存将全为0?
不会。如果有填充,则不能保证全为 0。此外,存在内存可能被其他成员占用的情况。
- 当 s11.s 位于内存 0x0 时,是否意味着 s11.i 位于 0x10?
不。
- 请解释为什么 sizeof(s11) 不是 16 乘以 2
可能是因为没有必要。以下是满足对齐要求的示例布局:
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
Run Code Online (Sandbox Code Playgroud)
而 sizeof(s1) 是 8 乘以 3?
以下是满足对齐要求的示例布局:
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
Run Code Online (Sandbox Code Playgroud)
我的示例适用于 double 为 8 字节、int 为 4 字节的系统。
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |