我一直遇到结构错位的问题。以下是涉及的结构:
struct Ray
{
float4 origin;
float4 dir;
float len;
float dummy [3];
};
struct RayStack
{
struct Ray r [STACK_DEPTH];
int depth [STACK_DEPTH];
float refr [STACK_DEPTH];
int top;
float dummy [3];
};
顺便说一句,STACK_DEPTH 是 4 的倍数。我一直小心确保所有结构的大小都是 16 的倍数,并且其中的 float4 位于对齐的边界上。
问题是当我将它用作局部变量时,结构 RayStack 未对齐:
struct RayStack stack;
printf("stack: %p\n", &stack);
堆栈地址最终以 8 结尾,而不是 0,因为我想要一个 16 字节对齐的结构。这会导致 ATI 卡崩溃(尽管 Intel 和 nVidia 并没有为此烦恼)。我尝试将 __attribute__((aligned(16))) 放置在结构中(之前和之后)以及局部变量定义中,但这并没有改变任何东西。实际上,添加 printf 语句可以解决问题,尽管我不知道如何解决。
是否可以确保局部变量堆栈在 16 字节边界上对齐并停止 ATI 卡上的崩溃。
谢谢!