当前位置: 首页 > 知识库问答 >
问题:

在C++中允许这些优化吗?[副本]

拓拔飞飙
2023-03-14

std::atomic num{0}; 在代码中可访问/可见的地方定义。C++编译器是否允许用一个空代码(什么都不做的东西)替换以下两个代码中的每一个?同样,这些优化是否允许在运行时发生?我只是想更好地理解事情是如何运作的。

num.fetch_add(1,std::memory_order_relaxed);
num.fetch_sub(1,std::memory_order_relaxed);

num.fetch_add(1,std::memory_order_relaxed);
std::this_thread::yield();
num.fetch_sub(1,std::memory_order_relaxed);

共有1个答案

慕容俭
2023-03-14

我认为理论上是的,甚至yield也无济于事。

但在实践中 没有 今天不是,但将来可能。

参见:

    null
 类似资料:
  • 有问题的代码如下: 编译器会优化它吗?根据C-Standard(如果我理解正确的话),第二个操作数必须提升为;因此乘法必须使用FPU(或fp仿真)完成。 从理论上讲,该操作可以在正常的硬件寄存器中完成,只需添加一个即时的(并且可能是溢出检查)。是否允许编译器执行此优化?是否有已知的编译器这样做?如果是这样,他们是否也会识别该表达式 这是避免有关隐式转换的静态代码检查器警告所必需的? 补充一下:我知

  • 我试图检查在哪里失去了准确表示大整数的能力。所以我写了这个小片段: 这段代码似乎适用于所有编译器,除了clang。Clang生成一个简单的无限循环。戈德博尔特。 这是允许的吗?如果是,这是QoI问题吗?

  • 问题内容: 我们有几个开发人员要求在我们的服务器上启用它。这些天的规范是什么,如果启用了,真的有什么充分的理由要允许吗? 环境是:Windows 2003,PHP 5.2.6,FastCGI 问题答案: 您肯定要设置为“关闭”,这也减轻了许多风险。 但是因为并非所有版本的PHP都具有,所以许多最佳实践是关闭fopen。与所有功能一样,现实是如果您的应用程序不需要它,请将其禁用。如果确实需要它,cu

  • 来自ISO/IEC 9899:201x第5.1.2.3节程序执行第4段: 关于volatile对象,这里允许的优化是什么?有人能给出一个可以优化掉的易失性访问的例子吗? 由于Volatile访问是一种可观察的行为(在第6段中描述),似乎没有任何优化可以针对Volatile进行,所以,我很想知道第4节中允许的优化是什么。

  • 以下代码在g和clang中正确编译: 然而,MSVC 2013给出了以下错误: 如果我将该行更改为: 然后三个编译器都编译成功了。原始版本正确吗?(即这是MSVC错误,还是gcc/clang扩展)