2017-07-02 132 views
0

考虑下面的代码:如何在结构内部对齐__m256d?

// 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) Deriveddata作为Derived的第一个成员。

Derived当前仅在堆栈上分配,但也可能以后需要堆分配。

更新:编译器是MSVC++ 2017,因此(部分)支持C++ 11/14/17。

+1

据我所知,对齐约束从单个字段传播到包含它们的聚合。因此,'__m256d'字段的对齐约束应该传播到'Data'结构,然后再传播到'Derived'结构。但是你可以通过'alignas(__ m256d)'明确地标注'Data'字段来对齐数据(或者,如果你没有C++ 11的支持,无论你使用的编译器的语法如何) 。 –

+0

您是否注意到任何错位?它应该自动工作,可能会在对象中间留下填充空间。动态分配是另一回事,显然VC++不支持“过度对齐的动态内存分配”。 –

+0

@MarcGlisse,不,我还没有发现任何错位。但是我想在发生之前知道潜在的错误。你能指出一些有关MSVC++的(非)支持“过度对齐动态内存分配”的链接吗?我无法在互联网上找到它,除了通用的http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r1.html –

回答

1

对于堆栈中的对象,从字段到封闭数据结构的对齐方式为properly propagated

此外,alignas可以used on data members

struct S{}; 

struct T 
{ 
    char c; 
    S alignas(32) s; 
}; 

有关堆对象,对准isn't guaranteed C++自动之前17。

在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