假设我有一些我想以固定顺序执行的语句.我想使用优化级别为2的g ++,因此可以重新排序某些语句.有什么工具可以强制执行某些语句排序?
请考虑以下示例.
using Clock = std::chrono::high_resolution_clock;
auto t1 = Clock::now(); // Statement 1
foo(); // Statement 2
auto t2 = Clock::now(); // Statement 3
auto elapsedTime = t2 - t1;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,重要的是语句1-3以给定的顺序执行.但是,编译器不能认为语句2独立于1和3并执行如下代码?
using Clock=std::chrono::high_resolution_clock;
foo(); // Statement 2
auto t1 = Clock::now(); // Statement 1
auto t2 = Clock::now(); // Statement 3
auto elapsedTime = t2 - t1;
Run Code Online (Sandbox Code Playgroud) 考虑ANSI C中的while循环,其唯一目的是延迟执行:
unsigned long counter = DELAY_COUNT;
while(counter--);
Run Code Online (Sandbox Code Playgroud)
我已经看到这很多用于强制执行嵌入式系统的延迟,例如.没有sleep功能,定时器或中断是有限的.
我对ANSI C标准的解读是,这可以通过符合标准的编译器完全删除.它没有5.1.2.3中描述的副作用:
访问易失性对象,修改对象,修改文件或调用执行任何这些操作的函数都是副作用,这些都是执行环境状态的变化.
......并且本节还说:
实际实现不需要评估表达式的一部分,如果它可以推断出它的值未被使用并且不产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用).
这是否意味着可以优化循环?即使counter是volatile?
笔记:
-O1或更高,除非counter是volatile),但我想知道标准规定了什么.