以下を考えると:
#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 ビット ロードを実行している) 理由はありますか? 負荷の調整?