如何在结构中对齐__m256d?

时间:2017-07-02 05:47:11

标签: c++ struct alignment sse avx

请考虑以下代码:

// 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。

1 个答案:

答案 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