我目前正在将atomic.hpp移植到项目的boost之外,并且想要推广原子添加函数,从而对要添加的类型进行模板化处理:
template <typename T, typename V>
inline T add(volatile T* mem, V val)
{
T r;
asm volatile
(
"lock\n\t"
"xadd %1, %0":
"+m"( *mem ), "=r"( r ):
"1"( val ):
"memory", "cc"
);
return r;
}
我找不到一个明确的文档,因为使用有符号和无符号的8,16,32和64位数字是安全的。有人知道吗?
答案 0 :(得分:2)
是的,你可以在IA32或IA64下使用lock xadd
所有类型的数字8,16,32和64位有符号或无符号。
不需要内存对齐,但如果是,则内存访问速度更快。
来自英特尔手册:
!LOCK前缀的完整性是 不受对齐的影响 记忆领域。内存锁定是 观察到任意错位 领域。这条指令的操作 在非64位模式下是相同的 64位模式。
警告强>:
如果LOCK前缀与XADD指令和源一起使用 操作数是一个内存操作数,一个 未定义的操作码异常(#UD)可以 生成。
因此源操作数必须是寄存器,目标操作数是内存地址!