由于(据我所知)ARM9 平台可能无法在未对齐的内存地址正确加载数据,我们假设未对齐意味着地址值不是 2 的倍数(即未在 16 位上对齐),那么如何一个访问会说,正确对齐的指针指向的字符串中的第四个字符吗?
char buf[] = "Hello world.";
buf[3]; // (buf + 3) is unaligned here, is it not?
编译器是否生成额外的代码,而不是 buf + 3
正确对齐的情况?或者上面示例中的最后一条语句在运行时会产生不希望的结果 - 产生除第四个字符之外的其他内容,即 Hello
中的第二个 l
?
最佳答案
字节访问不必对齐。编译器将生成一个 ldrb
指令,它不需要任何类型的对齐。
如果您想知道为什么,这是因为 ARM 将加载包含目标字节的整个对齐字,然后从刚刚加载的四个字节中简单地选择该字节。
关于c - 在 ARM 平台上,如何访问在内存中正确对齐的字符串的各个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17382973/