请考虑以下代码:
// Thin/POD struct
struct Data {
__m256d a;
__m256d b;
};
// Thick base class
class Base {
// ...
};
// Thick derived class
class Derived : public Base {
Data data;
// ...
};
有没有办法确保Derived::data
成员正确对齐AVX(32字节对齐)?
因为派生类有一个基础,所以似乎没有办法像class alignas(32) Derived
那样放置data
作为Derived
的第一个成员。
Derived
目前仅在堆栈上分配,但也可能稍后需要堆分配。
更新:编译器是MSVC ++ 2017,因此(部分)支持C ++ 11/14/17。
答案 0 :(得分:1)
对于堆栈上的对象,从字段到封闭数据结构的对齐为properly propagated。
此外,alignas
可以是used on data members
struct S{};
struct T
{
char c;
S alignas(32) s;
};
对于堆上的对象,在C ++ 17之前自动对齐isn't guaranteed。
在C ++ 17中,有几种方法可以在堆上分配对齐的内存。
struct alignas(32) S {};
auto s1 = std::aligned_alloc(alignof(S), sizeof(S));
auto s2 = new S; // has the meaning of...
auto s2_ = new (std::align_val_t(alignof(S))) S;
auto sz = alignof(S) + sizeof(S) - 1;
auto s3 = std::malloc(sz);
std::align(alignof(S), sizeof(S), s3, sz);
参考:
aligned_alloc
new
align
作为个人恩惠和世界和平,请不要使用std::align
。