2017-07-02 88 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