c - 在 ARM 平台上,如何访问在内存中正确对齐的字符串的各个字符?

标签 c compiler-construction arm posix c99

由于(据我所知)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/

相关文章:

c++ - 如果函数内联过于激进会怎样?

c++ - 未对齐访问导致 ARM Cortex-M4 出错

计算程序在虚拟机中的运行时间

java - JFlex 扫描仪 ArrayIndexOutOfBoundsException : 769

c - C 编程中将数字四舍五入到小数点后 3 位

java - 多次导入库需要什么

linux - socket() 在 C 客户端服务器应用程序中返回 0

c++ - 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

c - 参数比预期更多的函数调用

c - 汇编和 C 中的内核开发