gcc alignas 问题与指向对象的成员指针
gcc alignas issue with member pointers to objects
我使用的是 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->x 未在 32 字节边界上对齐。 x 的大小无关紧要,只要 x 是一个数组即可(因此 "double x = 0" 可以正常工作)。如果我改为将指针指向 B 静态分配的成员,它就可以正常工作。如果我在 main 中创建局部变量 *b1 和 *b2,它会正常工作。如果我在 class A 和 posix_memalign 中使用动态分配的数组,它会正常工作。
我是不是对 alignas 有什么误解。
如果我没理解错的话,来自下面的文档
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3396.htm
new
不需要遵守 alignas
。
我使用的是 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->x 未在 32 字节边界上对齐。 x 的大小无关紧要,只要 x 是一个数组即可(因此 "double x = 0" 可以正常工作)。如果我改为将指针指向 B 静态分配的成员,它就可以正常工作。如果我在 main 中创建局部变量 *b1 和 *b2,它会正常工作。如果我在 class A 和 posix_memalign 中使用动态分配的数组,它会正常工作。
我是不是对 alignas 有什么误解。
如果我没理解错的话,来自下面的文档
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3396.htm
new
不需要遵守 alignas
。