2016-04-08 63 views
3

我正在使用gcc 4.9.2,我正在嘗試正確地對齊靜態初始化數組用於AVX。下面是出現segfaults的代碼由於對準問題的要點是:gcc alignas問題與成員指針對象

#include <iostream> 
#include <cstddef> 

struct B { 
    alignas(32) double x[1] = {0}; 
}; 

struct A 
{ 
    A() { b1 = new B(); b2 = new B(); } 

    B* b1; 
    B* b2; 
}; 

int main(int argc, char** argv) { 
    A a; 

    int ret = (ptrdiff_t) a.b1->x % 32 + (ptrdiff_t) a.b2->x % 32; 

    std::cout << (ptrdiff_t) a.b1->x % 32 << "," << (ptrdiff_t) a.b2->x % 32 << "\n"; 

    return ret; 
} 

在我的系統,陣列a.b2-> X不爲32字節邊界上對齊。 x的大小並不重要,只要x是一個數組(所以「double x = 0」工作正常)。如果我將指針指向B靜態分配的成員,它將正常工作。如果我在主內部創建局部變量* b1和* b2,它可以正常工作。如果我在類A和posix_memalign中使用動態分配的數組,它可以正常工作。

我誤解了一些關於alignas的東西。

回答