了解该规则,即“程序已按编写的方式执行”

poo*_*Rui 53 c++ compiler-optimization

我正在尝试理解常规规则。根据cppreference

as-if规则
允许进行任何和所有不改变程序可观察行为的代码转换

解释
只要满足以下条件,C ++编译器就可以对程序进行任何更改:[...]

我很难理解“说明”部分的第二个技巧:

2)在程序终止时,写入文件的数据与在执行程序时完全一样。

我只是不明白“程序是按书面形式执行”的意思。

Max*_*hof 140

星期一,您的老板来到您的办公室,并说:“我需要在周四之前在办公桌上提交文件A,在周五之前在办公桌上提交文件B”。他首先在文件A中描述了他想要的东西,以及他认为你应该怎么做,然后在文件B中描述了他想要的东西。

在老板的脑海中,您将首先处理文件A的事情,在星期四将文件放在他的办公桌上,然后开始处理文件B并在星期五完成。但是您意识到,更早地开始对文件B进行工作(甚至在文件A之前)会更有意义。您的老板没有理由知道-他关心的只是在星期四收到A,在星期五收到B。您还意识到可以改进他建议的方式,因此您采用略有不同的方法来生成所需的信息。

以此类推,老板是一些C ++代码,而您是编译器。只要可观察到的行为(将文件放在老板桌面上)是相同的,编译器就可以重新安排操作(以其他顺序处理文件)是合法的。同样,编译器可以自由地对代码进行任何转换(使用与老板描述的方法不同的方法),以保持可观察的行为。

特别地,“好像程序是按照书面执行的”意味着“好像您按照老板的指示去做一样工作”(即使您做了不同的事情)。


sup*_*cat 15

引用规则的一个重要特征是,它为实现的实现指定了最低限度的一组要求,但绝不意味着这些要求对于任何特定应用程序都是足够的,也不意味着某些应用程序不需要实现即可提供更有力的保证。假设执行和记录单个测试结果的过程为:

  1. 做实验。
  2. 写下测量结果。
  3. 解锁保险箱
  4. 将带有测量值的纸张放在保险箱中。
  5. 锁上保险柜。

如果给出一个三个测试来执行,人们可以在为了使每个测试执行上述的五个步骤,但任何步骤的以下序列的可能也是可以接受的:

  1. 做实验#1
  2. 在纸#1上写下测量结果
  3. 做实验2
  4. 在纸#2上写下测量结果
  5. 做实验#3
  6. 在纸#3上写下测量结果
  7. 解锁保险箱
  8. 将#1纸张放入保险箱
  9. 将2号纸放入保险箱
  10. 将3号纸放入保险箱
  11. 锁上保险柜

或-为了避免一次跟踪三篇论文:

  1. 做实验#1
  2. 在纸#1上写下测量结果
  3. 解锁保险箱
  4. 将#1纸张放入保险箱
  5. 做实验2
  6. 在纸#2上写下测量结果
  7. 将2号纸放入保险箱
  8. 做实验#3
  9. 在纸#3上写下测量结果
  10. 将3号纸放入保险箱
  11. 锁上保险柜

如果一切都按预期进行,那么这三种方法都是等效的。但是,如果第二个实验可能出错,并且弄丢了桌上的所有纸张,那么使用第二种方法将可能会丢失第一个实验的结果-如果采用了完全详细的程序,那么该结果就不会发生跟着。更糟糕的是,如果第三个实验真的出错了,并且把没有在保险柜中的所有东西都扔掉了,那么第三个方法将冒着丢失保险柜中所有东西的风险,甚至失去与实验无关的内容。

在某些情况下,第二种或第三种方法可能是合适的。在某些情况下不会。判断这些方法是否合适将需要了解实验带来的风险,安全内容以及许多其他因素。

该标准的作者无法知道判断哪些应用程序需要什么保证所需的一切。相反,他们依靠各种实现的生产者和用户来认识将需要哪些保证来安全有效地完成需要完成的任何事情。