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的東西。
請注意,您可以實現調用'posix_memalign'的自定義'operator new'。 – o11c
我還在gcc-bugzilla中發佈了一個錯誤,並得到了類似的答案:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 70603 – kounoupis