1

在 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:我在这里发布了一个后续问题

4

1 回答 1

2

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

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

如果您的调用者传递给您一个未充分对齐的指针,那是未定义的行为和他们的代码中的错误(第 6.3.2.3 节)。您不需要支持(尽管您可以选择支持)。

于 2012-06-07T14:18:11.407 回答