常见的经验法则是,在没有立即计算值的情况下,使用STL迭代器上的预增量(也就是说,您只想增加对象/迭代器)。这是因为通常情况下,预增量的实现要比后增量更有效。
但是std::原子呢?如果我运行静态分析(使用PVS工作室),我会收到警告说,预增量应该更有效,但是当我查看前增量(在Visual 2015上)的实现时,它看起来比增量后的效率要低吗?
在STL原子值上是否有使用前增量大于后增量的一般规则,或者它是否是特定于实现的?
发布于 2016-11-29 10:41:26
效率(在这个级别)总是特定于实现的。
例如,作为与经验法则“倾向于STL迭代器的预增量”相反,实际上很少编译器会为增量前和增量后生成不同的代码。(后增量的虚假副本只会被优化为零。)
发布于 2016-11-29 11:01:37
我现在还没有进入窗户的权利,但在gcc看来,不同的是
__atomic_fetch_add(&_M_i, 1, memory_order_seq_cst);和
__atomic_add_fetch(&_M_i, 1, memory_order_seq_cst);它们是内置的,所以您可以假设编译器知道如何优化它。
如果不使用这个结果,gcc -O3就会产生
lock add DWORD PTR [rdi], 1对两个人来说。
如果你确实使用了这个结果,那么gcc -O3就会产生
mov DWORD PTR [rsp-24], edi
mov eax, 1
lock xadd DWORD PTR [rsp-24], eax
add eax, 1
ret对于预增量,省略了add eax, 1作为后置增量,因此,从技术上讲,预增量对于一个添加来说效率较低,但在现实中,这与顺序内存访问相比相形见绌。
TLDR:别担心
https://stackoverflow.com/questions/40863255
复制相似问题