c语言O2优化开启优缺点,c – 为什么clang中的-O2或更高优化会破坏此代码?

我在网站上检查了类似的问题,但我找不到符合我的情况的任何内容.这是我正在尝试运行的代码(需要C 14):

#include

#include

#include

using namespace std;

class countdownTimer {

public:

using duration_t = chrono::high_resolution_clock::duration;

countdownTimer(duration_t duration) : duration{ duration }, paused{ true } {}

countdownTimer(const countdownTimer&) = default;

countdownTimer(countdownTimer&&) = default;

countdownTimer& operator=(countdownTimer&&) = default;

countdownTimer& operator=(const countdownTimer&) = default;

void start() noexcept {

if (started) return;

startTime = chrono::high_resolution_clock::now();

endTime = startTime + duration;

started = true;

paused = false;

}

void pause() noexcept {

if (paused || !started) return;

pauseBegin = chrono::high_resolution_clock::now();

paused = true;

}

void resume() noexcept {

if (!paused || !started) return;

auto pauseDuration = chrono::high_resolution_clock::now() - pauseBegin;

startTime += pauseDuration;

endTime += pauseDuration;

paused = false;

}

double remainingSeconds() const noexcept {

auto ret = double{ 0.0 };

if (!started) ret = chrono::duration_cast<:duration>>(duration).count();

else if (paused) ret = chrono::duration_cast<:duration>>(duration - (pauseBegin - startTime)).count();

else ret = chrono::duration_cast<:duration>>(duration - (chrono::high_resolution_clock::now() - startTime)).count();

return (ret < 0.0) ? 0.0 : ret;

}

duration_t remainingTime() const noexcept {

auto ret = duration_t{ 0ms };

if (!started) ret = chrono::duration_cast(duration);

else if (paused) ret = chrono::duration_cast(duration - (pauseBegin - startTime));

else ret = chrono::duration_cast(duration - (chrono::high_resolution_clock::now() - startTime));

return (ret < 0ms) ? 0ms : ret;

}

bool isPaused() const noexcept { return paused; }

bool hasFinished() const noexcept { return remainingTime() == 0s; }

void reset() noexcept {

started = false;

paused = true;

}

private:

chrono::high_resolution_clock::time_point startTime;

chrono::high_resolution_clock::time_point endTime;

chrono::high_resolution_clock::time_point pauseBegin;

duration_t duration;

bool paused;

bool started;

};

int main() {

countdownTimer timer(10s);

timer.start();

while (!timer.hasFinished()) {

cout << timer.remainingSeconds() << endl;

this_thread::sleep_for(1s);

}

}

这是我为我的一个项目写的一个简单的倒数计时器类. main()中的客户端代码非常明显,它应该从10输出倒计时到0,然后退出程序.没有优化或-O / -O1,它确实如此:

10

8.99495

7.98992

6.9849

5.97981

4.9748

3.96973

2.9687

1.9677

0.966752

Program ended with exit code: 0

但是如果我将优化升级到> = – O2,程序只会输出10,并且会永远运行.倒计时根本不起作用,它停留在起始值.

我在OS X上使用最新的Xcode.clang –version说Apple LLVM版本7.3.0(clang-703.0.31).

奇怪的是,我的代码不包含任何奇怪的自编循环,未定义的行为,或类似的东西,它几乎只是标准的库调用,所以优化打破它是非常奇怪的.

有任何想法吗?

PS:我没有在其他编译器上尝试过,但我很乐意.我将用这些结果更新问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值