C++对齐和数组

Kay*_*Kay 0 c c++

  • 我有一些T我明确指定为x -aligned的类型
  • x >sizeof(T)
  • x >任何实现基本对齐
  • (例如:x是页面或缓存对齐)

假设我现在有:T arr[y],其中arrX -aligned(无论是通过被分配在堆栈上,或者在数据,或由X -aligned堆分配)

然后至少有一些arr[1],...,arr[y-1]不是x对齐的.

正确?(事实上​​,如果不随扩展对齐规范改变,它必须是正确的sizeof(T))

注1:这是一样的问题是如何的阵列在C++对准相比包含一个类型?.这个问题询问阵列本身的对齐方式,而不是内部各个元素的对齐方式.

注2:这个问题:alignas会影响sizeof的值吗?基本上就是我要问的 - 但是对于扩展对齐.

注3:https://stackoverflow.com/a/4638295/7226419 这个问题是一个权威的答案(sizeof(T)包括满足对齐要求所需的任何填充,以使所有T的数组T正确对齐.

n. *_* m. 9

如果type T是x-aligned,则每个类型的对象T都是x-aligned,包括任何数组元素.特别是,这种方式x > sizeof(T)不可能成立.

几个现代编译器的快速测试证实:

#include <iostream>

struct alignas(16) overaligned {};
struct unaligned {};

template <class T> void sizes()
{
    T m, marr[2];
    std::cout << sizeof(m) << " " << sizeof(marr) << std::endl;
}

int main ()
{
    sizes<unaligned>();
    sizes<overaligned>();
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2
16 32
Run Code Online (Sandbox Code Playgroud)