我正在使用gcc 4.9.2并且我正在尝试正确对齐静态初始化的数组以与AVX一起使用。以下是由于对齐问题而导致段错误的代码要点:
#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-&gt; x未在32字节边界上对齐。 x的大小无关紧要,只要x是一个数组(所以&#34; double x = 0&#34;工作正常)。如果我指向B静态分配的成员,它可以正常工作。如果我在main中创建局部变量* b1和* b2,它可以正常工作。如果我在A类和posix_memalign中使用动态分配的数组,它可以正常工作。
我是否误解了对齐的事情。
答案 0 :(得分:1)