在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。
答案 0 :(得分:2)
保证float complex
具有与两个float
(第6.2.5节)的数组相同的内存布局和对齐方式。确切地说,对齐将由您的编译器或平台定义。您可以肯定地说,float complex
至少与float
一致 。
如果假定对齐,那么如何确保传递的地址是实际的复杂而不是来自另一个(非8对齐)类型的强制转换呢?
如果你的调用者通过了一个不完全对齐的指针,那就是未定义的行为和代码中的错误(§6.3.2.3)。你不需要支持(尽管你可以选择)。