当在struct中使用alignof运算符时,它会影响sizeof

Tii*_*ina 1 c++

struct s11
{
    alignas(16) char s;
    int i;
};
Run Code Online (Sandbox Code Playgroud)
  1. 是否alignas(n) X x意味着它将分配 n 个字节来保存 a X,当X实际上远小于 n 字节时,其余内存将全为 0?

  2. s11.s记忆中的 是什么时候0x0,是否意味着s11.i将会在0x10?然而,以下pdiff0x4

s11 o;
ptrdiff_t pdiff = (char*)&o.i - (char*)&o.s;
Run Code Online (Sandbox Code Playgroud)
  1. 请解释为什么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。

eer*_*ika 5

当在struct中使用alignof运算符时,它会影响sizeof

您没有使用alignof运算符。您正在使用alignas说明符。

使用alignas说明符不一定会影响类的大小,但它可以影响类的大小。

  1. alignas(n) X x是否意味着它会分配n个字节来保存X,当X实际上比n个字节小得多时,其余内存将全为0?

不会。如果有填充,则不能保证全为 0。此外,存在内存可能被其他成员占用的情况。

  1. 当 s11.s 位于内存 0x0 时,是否意味着 s11.i 位于 0x10?

不。

  1. 请解释为什么 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 字节的系统。