【发布时间】:2018-02-03 14:07:02
【问题描述】:
在下面的循环中
int i = 0;
// pass address of i to some other part of the program
// Do some work
for (; i < 10;)
{
// Do some more work
function_that_increments_i();
}
如果出于某种(奇怪的,理论上的)原因,编译器优化了 i < 10 中 i 的内存读取并始终读取加载的第一个值,这种行为是否符合标准?我想知道 C++ 语言的哪一部分描述了这种情况下的行为。
编辑:在与@Rakete1111 讨论后,我希望专家对以下语言及其含义进行说明:
对一致性实现的最低要求是:
(7.1) — 通过 volatile glvalues 的访问被严格评估 根据抽象机的规则。
(7.2) — 在程序终止时,所有写入文件的数据应 与执行程序的可能结果之一相同 根据抽象语义会产生。
(7.3) — 交互式设备的输入和输出动态应 以这样一种方式发生,即提示输出实际上是 在程序等待输入之前交付。什么构成 交互式设备是实现定义的。
这些统称为可观察的行为 程序。 [注:abstract 和 实际语义可以由每个实现来定义。 ——尾注]
按照我的解释,这可以优化对i 的读取。我在这里错过了什么?
【问题讨论】:
-
但您需要以某种方式将
i传递给函数。我认为,你需要提供一个具体的例子。 -
@Yola 看看第一条评论,上面写着
i的地址已被传递给程序的其他部分。该函数通过该指针的副本访问i。 -
other part 可能在翻译单元中为
function_that_increments_i或在另一个单元中,这可能很重要。 -
如果您不向其中传递任何参数,您将如何从
function_that_increments_i访问i?通过全局变量?我认为编译器可以检测到它。 -
@Yola 是的,编译器可以检测到这一点,但标准的哪一部分强制执行它?
标签: c++ memory optimization compiler-construction