是否保证Complex Float变量在内存中是8字节对齐的?

时间:2012-06-07 08:33:54

标签: gcc c99 compiler-optimization memory-alignment complex-numbers

在C99中定义了新的复杂类型。我试图了解编译器是否可以利用这些知识优化内存访问。类型A的这些对象(F - complex float)是否保证在内存中以8字节对齐?


#include "complex.h"
typedef complex float cfloat;

cfloat A;
cfloat B[10];

void func(cfloat C, cfloat *D)
{
    cfloat E;
    cfloat F[10];
}

请注意,对于D,问题与D指向的对象有关,而与指针存储本身无关。并且,如果假定对齐,那么如何确保传递的地址是实际的复杂而不是来自另一个(非8对齐)类型的强制转换呢?

更新1:我可能在关于D指针的最后评论中回答了自己。 B / c无法知道将什么地址分配给函数调用的参数,没有办法保证它将是8对齐的。这可以通过__builtin_assumed_aligned()函数解决。

其他变量仍然存在问题。

更新2:我发布了follow-up question here

1 个答案:

答案 0 :(得分:2)

保证float complex具有与两个float(第6.2.5节)的数组相同的内存布局和对齐方式。确切地说,对齐将由您的编译器或平台定义。您可以肯定地说,float complex 至少与float一致

  

如果假定对齐,那么如何确保传递的地址是实际的复杂而不是来自另一个(非8对齐)类型的强制转换呢?

如果你的调用者通过了一个不完全对齐的指针,那就是未定义的行为和代码中的错误(§6.3.2.3)。你不需要支持(尽管你可以选择)。