鉴于以下情况:
#include <stdint.h>
#include <stdio.h>
uint16_t foo(uint8_t* x)
{
uint16_t r = (x[1] << 8) | x[0];
return r;
}
uint16_t bar(uint8_t* x)
{
uint16_t r = ((uint16_t*) x)[0];
return r;
}
在 x86_64 上,GCC 和 Clang 都生成类似于以下内容的代码:
foo: # @foo
.cfi_startproc
# BB#0: # %entry
movzbl (%rdi), %ecx
movzbl 1(%rdi), %eax
shll $8, %eax
orl %ecx, %eax
movzwl %ax, %eax
ret
bar: # @bar
.cfi_startproc
# BB#0: # %entry
movzwl (%rdi), %eax
ret
是否有任何理由不将 foo 优化为等同于 bar (即执行单个 16 位加载)?负载对齐?