fuz*_*fuz 9 c optimization idioms endianness
在Plan 9源代码中,我经常会找到这样的代码来读取具有明确定义的字节顺序的缓冲区中的序列化数据:
#include <stdint.h>
uint32_t le32read(uint8_t buf[static 4]) {
return (buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24);
}
Run Code Online (Sandbox Code Playgroud)
我希望gcc和clang都能将这段代码编译成像amd64上的这个程序集一样简单:
.global le32read
.type le32read,@function
le32read:
mov (%rdi),%eax
ret
.size le32read,.-le32read
Run Code Online (Sandbox Code Playgroud)
但是与我的期望相反,gcc和clang都没有认识到这种模式,而是产生了多次轮换的复杂装配.
有没有这种操作的习惯用法,既可以移植到所有C99实现,又可以跨实现产生良好的(如上面提到的那样)代码?