我一直在 gcc/x86 下使用这个小函数来进行 int16_t 的快速字节交换:
static inline int16_t MySwapInt16t(int16_t val)
{
__asm__ ("xchgb %b0, %h0" : "=Q" (val) : "0" (val));
return val;
}
...今天在网上浏览别人的代码时,我看到他有一个类似的功能,看起来像这样:
static inline int16_t HisSwapInt16t(int16_t val)
{
__asm__ ("xchgb %h0, %b0" : "+Q" (val));
return val;
}
我的功能和他的功能(AFAICT)之间的区别是:
- 他指定“+Q”而不是“=Q”
- 交换 %h0 和 %b0 的位置
- 他的函数末尾没有 : "0" (val) 子句
据我所知,这两种实现似乎都可以正常工作,但内联汇编对我来说有点像魔法,所以有知识的人可以解释一下:
- 上面列出的三个差异有什么意义?
- 这两种实现中的一种是否比另一种更好或更快,或者它们的性能是否相同?