指针转换是否保持对齐属性?

Ral*_*zky 8 c++ memory pointers alignment language-lawyer

说,我有一个对齐的数组

alignas(X) char arr[sizeof(X)];
Run Code Online (Sandbox Code Playgroud)

是指针

X * ptr = reinterpret_cast<X*>(arr);
Run Code Online (Sandbox Code Playgroud)

保证根据X?的对准要求正确对准。

似乎确实是这种情况,但是从C ++标准来看似乎并不明显。

我在标准中找不到阻止编译器对齐表单结构的任何内容

struct X
{
    int16_t a;
    int32_t b;
    int16_t c;
};
Run Code Online (Sandbox Code Playgroud)

像这样在内存中:

+-+-+-+-+-+-+-+-+
|a|a|b|b|b|b|c|c|
+-+-+-+-+-+-+-+-+
     ^
     aligned to 32-boundary
Run Code Online (Sandbox Code Playgroud)

从而使类型的对象以X不需要填充的方式b对齐,并同时正确对齐到32位边界。声明(N4713,第6.6.5.1节)

对准是表示在一个给定的对象可以被分配连续地址之间的字节数实现定义整数值。

并没有因此而受到违反,而且我在标准中也没有看到其他违反它的陈述。

sup*_*cat 1

该标准的作者并没有试图明确禁止他们认为不可能的事情。如果一个编译单元包含类似于您给出的结构:

struct {
  uint16_t a;
  uint32_t b;
  uint16_t c;
} x;
Run Code Online (Sandbox Code Playgroud)

并且编译器并不知道在程序的其余部分中可能使用具有相同布局的结构或结构的所有方式x,它别无选择,只能使 的偏移量b成为 的对齐的倍数b。我不认为标准明确指出结构的布局不能明显受到其使用方式的影响,但我认为这是因为他们认为布局可能以这种方式变化的编译器能够维护共同初始序列保证。