首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::atomic<int>上增量前后的比较

std::atomic<int>上增量前后的比较
EN

Stack Overflow用户
提问于 2016-11-29 10:17:20
回答 2查看 1.1K关注 0票数 3

常见的经验法则是,在没有立即计算值的情况下,使用STL迭代器上的预增量(也就是说,您只想增加对象/迭代器)。这是因为通常情况下,预增量的实现要比后增量更有效。

但是std::原子呢?如果我运行静态分析(使用PVS工作室),我会收到警告说,预增量应该更有效,但是当我查看前增量(在Visual 2015上)的实现时,它看起来比增量后的效率要低吗?

在STL原子值上是否有使用前增量大于后增量的一般规则,或者它是否是特定于实现的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-29 10:41:26

效率(在这个级别)总是特定于实现的。

例如,作为与经验法则“倾向于STL迭代器的预增量”相反,实际上很少编译器会为增量前和增量后生成不同的代码。(后增量的虚假副本只会被优化为零。)

票数 1
EN

Stack Overflow用户

发布于 2016-11-29 11:01:37

我现在还没有进入窗户的权利,但在gcc看来,不同的是

代码语言:javascript
复制
__atomic_fetch_add(&_M_i, 1, memory_order_seq_cst);

代码语言:javascript
复制
__atomic_add_fetch(&_M_i, 1, memory_order_seq_cst);

它们是内置的,所以您可以假设编译器知道如何优化它。

如果不使用这个结果,gcc -O3就会产生

代码语言:javascript
复制
    lock add        DWORD PTR [rdi], 1

对两个人来说。

如果你确实使用了这个结果,那么gcc -O3就会产生

代码语言:javascript
复制
    mov     DWORD PTR [rsp-24], edi
    mov     eax, 1
    lock xadd       DWORD PTR [rsp-24], eax
    add     eax, 1
    ret

对于预增量,省略了add eax, 1作为后置增量,因此,从技术上讲,预增量对于一个添加来说效率较低,但在现实中,这与顺序内存访问相比相形见绌。

TLDR:别担心

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40863255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档