【发布时间】:2012-05-31 19:07:20
【问题描述】:
鉴于以下情况:
#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 位加载)?负载对齐?
【问题讨论】:
-
您不应该在转换之前将
x[1]类型转换为 uint16_t 吗?否则,您似乎会得到x[1] << 8 == 0,因为只有 8 位并且您将它们全部移出。 -
@Matt
x[1]在x[1] << 8中提升为int。 -
@Matt:不,“整数促销”适用,在班次前
x[1]被提升为int。
标签: c gcc clang compiler-optimization