在 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:我发布了后续问题在这里.
A float complex
保证与两个数组具有相同的内存布局和对齐方式float
(第 6.2.5 节)。具体的对齐方式是由您的编译器或平台定义的。你只能肯定地说float complex
is 至少对齐 as a float
.
如果假设是对齐的,那么如何确定传递的地址是实际的复合地址,而不是来自另一种(非 8 对齐)类型的强制转换?
如果您的调用者向您传递了一个未充分对齐的指针,则这是未定义的行为,并且是其代码中的错误(第 6.3.2.3 节)。您不需要支持这一点(尽管您可以选择支持)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)