编译器优化协程值

时间:2020-07-04 03:40:31

标签: c++ gcc c++20 c++-coroutine gcc10

我已经实现了两个使用Resumable类的协程:

#include <coroutine>
#include <future>
#include <iostream>

class Resumable
{
public:
    class promise_type
    {
    public:
        auto initial_suspend()
        {
            return std::suspend_always();
        }

        auto final_suspend() noexcept
        {
            return std::suspend_always();
        }

        auto yield_value(const int& value)
        {
            value_ = value;
            return std::suspend_always();
        }

        auto return_value(const int& value)
        {
            value_ = value;
            return std::suspend_always();
        }

        auto get_return_object()
        {
            return std::coroutine_handle<promise_type>::from_promise(*this);
        }

        void unhandled_exception()
        {
        }

    public:
        int value_;
    };

public:
    Resumable(std::coroutine_handle<promise_type> handle)
        : handle_{ handle }
    {
    }

    ~Resumable()
    {
        handle_.destroy();
    }

    int get()
    {
        if (!handle_.done())
        {
            handle_.resume();
        }
        return handle_.promise().value_;
    }

private:
    std::coroutine_handle<promise_type> handle_;
};

Resumable generate(int a)
{
    for (int i = 1; i < a; ++i)
    {
        co_yield i;
    }
    co_return 0;
}

Resumable n_generate(int a)
{
    auto gen = generate(a);
    for (auto value = gen.get(); value != 0; value = gen.get())
    {
        //std::cout << -value << std::endl; <-- uncommenting this fixes the problem 
        co_yield -value;
    }
    co_return 0;
}

int main(int argc, const char* argv[])
{
    auto gen_10 = n_generate(10);
    for (auto value = gen_10.get(); value != 0; value = gen_10.get())
    {
        std::cout << value << std::endl;
    }
    return 0;
}

此代码的输出为空。

如果我取消对n_generate中标记为line的行的注释,则输出将为:

-1
-1
-2
-2
-3
-3
-4
-4
-5
-5
-6
-6
-7
-7
-8
-8
-9
-9

如何在不使用main函数打印它们的情况下将负值传递给n_generate

我在Ububtu 20.04上使用gcc-10。 我的makefile中的其他标志:

LDLIBS := -lstdc++
CXXFLAGS := -g -std=c++2a -fcoroutines

0 个答案:

没有答案