问题标签 [as-if]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 标准中“好像”规则的陈述或基础在哪里?
经过一点谷歌搜索(例如,site:eel.is "as if rule"
)后,我找不到在 C++ 标准中明确说明所谓“好像”规则的适当位置。我所能找到的只是在标准中调用它的那些地方,intro.execution
给出了参考。
但intro.execution
似乎没有明确引用此规则的任何一般形式。我可能在这里遗漏了一些微妙的东西,但是你能指出我对规则的精确规范理解的地方吗?也许整体intro.execution
确实是为了传达我们所说的野外“好像”规则?我承认我只是略过它。
我正在使用这个网站浏览标准的工作草案。
例如,可以在cppreference 站点中找到“好像”规则的定义,即只要满足某些约束条件,例如出于优化原因,编译器就可以对程序执行转换。
c++ - C ++中复制省略背后的基本原理是什么?
C++ 标准允许(要求)编译器优化对复制构造函数的调用(在某些情况下)的原因是什么,即使它可能包含可观察到的副作用?
如果我没记错的话,“好像”规则已经允许编译器优化不必要的代码,只要生成的程序模拟标准中定义的抽象机器的可观察行为。
制定例外规则的动机是什么?它不会在语言中造成不一致吗?方便(或必要)吗?
c++ - as-if 规则是否允许这种执行重新排序
众所周知,编译器或 CPU 可以根据需要重新排序执行,前提是它们遵循 as-if 规则。例如,如果我们有这样一段代码:
编译器或 CPU 可能会D = E + F
在C = A + B
. 我可以理解。
现在让我们谈谈另一个案例。
说我有两个线程a
和b
. 我想在执行时设置一些标记,以便我可以监控和的整个a
过程b
。
我的问题是:既然我们有 as-if 规则并且执行顺序可能会重新排序,是否意味着其中的消息q
不可靠?意思是真正的执行顺序是a - 1
, b - 1
,但其中可能有, ,b - 2
和? 如果可能发生这种情况,我应该如何设计或使用哪种技术来监控多线程进程?a - 2
q
a - 1
a - 2
b - 1
b - 2
c++ - 这种执行重新排序是否可能
众所周知,编译器或 CPU 可以根据需要重新排序执行,前提是它们遵循 as-if 规则。例如,如果我们有这样一段代码:
编译器或 CPU 可能会D = E + F
在C = A + B
. 我可以理解。
今天同事尝试用C++搭建一个日志库。他的想法是使用构造函数和析构函数在一些重载流函数的帮助下制作一些日志,例如operator<<()
.
基本上,他提供了这样一种课程:
现在,我是日志库的用户。我的同事告诉我,我可以使用以下库:
所以当第一行执行时,构造函数被调用,所以我可以在日志中得到一个“开始”。当函数返回时,log
将调用析构函数,所以我会end
在日志中得到一个。借助 object log
,我们可以清楚地找到函数的开始和函数的结束。
这听起来清晰而伟大。
但是,正如我在文章开头提到的那样,机器可能会根据需要进行一些重新排序。所以我现在想知道是否有可能log
调用的构造函数比我们想象的要晚和/或调用的析构函数log
比我们想象的要早,因此log
不能按我们预期的那样工作。我的意思是,代码func
确实如上所示,但是当它被编译或执行时,真正的顺序变成了:
顺便说一句,类中的流Log
被定向到其他地方,例如文件、共享内存或 TCP 套接字。
那我讲道理吗?或者这种重新排序永远不会发生?如果可能发生,是否有某种技术可以禁止这种重新排序,或者是否有某种技术可以提供一个可用的日志库来告诉我们任何函数的开始和结束?
事实上,我听说过一些 C++11 中的新技术,例如std::atomic
and std::atomic_thread_fence
. 据我了解,如果这种重新排序是可能的,我需要的可能是……栅栏?
我真的不知道这是否可能......
关于副作用/可观察的行为
据我了解,这是一种副作用/可观察到的行为:
为什么?因为 的值发生了A
变化。
现在,如果我这样编码怎么办:
所以顺序可能是:
- 的构造函数
log
A = B + C
- 的析构函数
log
但是,如果订单变为:
A = B + C
- 的构造函数
log
- 的析构函数
log
我认为那会很好。为什么?因为A
关于副作用/可观察行为的 的值没有被修改。无论我们采用哪种顺序,它的值总是B + C
。
我对吗?如果我是对的,我认为这意味着Log
不会按预期工作。
更新
A = B + C
有一个副作用,即 的值发生了A
变化,但这不是可观察到的行为。