相关疑难解决方法(0)

在C++中强制执行语句顺序

假设我有一些我想以固定顺序执行的语句.我想使用优化级别为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)

c++ operator-precedence c++11

103
推荐指数
4
解决办法
1万
查看次数

ANSI C编译器可以删除延迟循环吗?

考虑ANSI C中的while循环,其唯一目的是延迟执行:

unsigned long counter = DELAY_COUNT;
while(counter--);
Run Code Online (Sandbox Code Playgroud)

我已经看到这很多用于强制执行嵌入式系统的延迟,例如.没有sleep功能,定时器或中断是有限的.

我对ANSI C标准的解读是,这可以通过符合标准的编译器完全删除.它没有5.1.2.3中描述的副作用:

访问易失性对象,修改对象,修改文件或调用执行任何这些操作的函数都是副作用,这些都是执行环境状态的变化.

......并且本节还说:

实际实现不需要评估表达式的一部分,如果它可以推断出它的值未被使用并且不产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用).

这是否意味着可以优化循环?即使countervolatile

笔记:

  1. 这与编译器允许消除无限循环不完全相同,因为它指的是无限循环,并且出现关于何时允许程序终止的问题.在这种情况下,程序肯定会在某个时刻通过这条线,优化与否.
  2. 我知道GCC做了什么(删除循环-O1或更高,除非countervolatile),但我想知道标准规定了什么.

c optimization standards c89

5
推荐指数
2
解决办法
1047
查看次数

标签 统计

c ×1

c++ ×1

c++11 ×1

c89 ×1

operator-precedence ×1

optimization ×1

standards ×1