【发布时间】:2017-12-05 16:12:16
【问题描述】:
考虑以下代码:
// 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。
【问题讨论】:
-
据我所知,对齐约束从单个字段传播到包含它们的聚合。因此,
__m256d字段的对齐约束应该传播到Data结构,然后再传播到Derived结构。但是您可以通过使用alignas(__m256d)显式注释它来确保Data字段对齐(或者,如果您没有 C++11 支持,则无论您使用的编译器的语法是什么)。跨度> -
您是否注意到任何错位?它应该自动工作,可能会在对象中间留下填充空间。动态分配是另一回事,显然VC++还不支持“过度对齐的动态内存分配”。
-
@MarcGlisse,不,我还没有注意到任何错位。但我也想知道潜在的错误,在它们发生之前。您能否指出一些有关 MSVC++(不)支持“过度对齐的动态内存分配”的链接?我在互联网上找不到它,除了通用 open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r1.html
-
谢谢,我现在清楚了。有人想将这些 cmets 组合成一个答案吗?
标签: c++ struct alignment sse avx