支持未对齐内存访问的 ARM-CPU 是否需要特殊的指针修饰来实现 C/C++ 中的未对齐访问?或者我可以使用每个指针进行未对齐访问吗?或者这取决于编译器?
简而言之,这是依赖于编译器的,因为 C 标准没有涵盖它。
然而,正如评论中所指出的,一些 ARM 指令需要对齐指针,并且任何 ARM 编译器都需要实现一些对齐策略。由于 ARM 处理器通过对齐访问可以更高效地工作,因此编译器通常会确保数据对齐。
编译器也可能提供处理非对齐数据的方法(当然,这又是编译器定义的行为,实现了 C 标准中未定义的行为)。常见的例子是打包结构和指针转换。
我们来看几个案例:
__packed struct
{
char a;
int i;
} s;
在这种情况下,&s.i
可能是一个未对齐的指针,这很好,因为编译器知道这一点并可以相应地生成代码。
char buffer[80];
void decode(int *i)
{
int n = i[0];
...
}
在这种情况下buffer
可能未对齐(作为数组char
s,没有必要),但是,如果编译器正常对齐int
s,那么编译器会假设该指针*i
in decode()
已对齐并且可以基于该假设生成代码。
在这种情况下,调用decode((int *)buffer)
可能会导致处理器出现硬故障。
因此,更长的答案是(至少在我知道的情况下)对齐/未对齐指针没有可见的“装饰”,但编译器可能会根据指针的类型和来源做出假设,从而有一种指针的内部“装饰”。在这种情况下,避免“欺骗”编译器做出错误的假设很重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)