CPU指令的原子性
Atomic vs. Non-Atomic Operations
首先需要注意有些指令是宏,并不是真正的单条指令
单条指令并不都是原子的
armv7提供了一条指令将两个32位寄存器组成64位,存储到内存中去,这条指令有torn write的风险
x86 纯读写指令只有在不跨cache line情况下才能保证原子
c++ - Is incrementing an int effectively atomic in specific cases? - Stack Overflow
x86指令add DWORD PTR [rbp - 4] 1 具有CISC风格
可以被归类为Read Modify Write
这条指令设计多个uop
在这条指令中,涉及了两次总线的获取和释放,中间存在可以插入acquire的机会
AGENT 1 AGENT 2
load X
inc C
load X
inc C
store X
store X
lock前缀使得这条指令变成原子的,此外还有内存屏障功能
cache locking+缓存一致性
TODO
跨cache line的情况,以及失败的原子指令 原子指令对一致性的性能影响 c++ - Atomicity of loads and stores on x86 - Stack Overflow
单处理器系统只需提防中断,并行IO设备,DMA
赋值和构造的开销不一定差不多
对于字符串和容器类这些容器,赋值时可以考虑直接重用已分配的空间,而构造一定会开辟新空间。
因此这些类如果对性能有需求,不应在赋值函数使用copy-and-swap idiom
String& operator=(String&& rhs) noexcept{
String(std::move(rhs)).swap(*this); //这里构造临时对象个人理解是防止自赋值
return *this;
}