如何使用新的 C 17 执行策略?

新手上路,请多包涵

我正在阅读 cppreference.com 上的 std::algorithm 文档,我注意到很多我还没有使用过的很酷的东西上有一个 C++17 标签。最引起我注意的是 新的执行政策。 我从阅读它们中收集到的是,我可以通过指定执行策略来制作任何想要多线程的 for_each 循环。

例如,我有一个程序可以输出带有 2D 图形的图像。

 int main(){
    std::for_each(
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

如果我想让这个程序多线程,我应该可以用一行来完成。

 int main(){
    std::for_each(
        std::execution::par_unseq, // c++17 feature
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

However when I first tried this (with g++ -std=c++17 ) I got an error telling me that ‘std::execution’ has not been declared , so I tried adding #include <execution> but it says execution: No such file or directory .我也试过 #include<experimental/algorithm> 而不是 #include<algorithm> 但我得到了相同的结果。我该如何使用这个新功能?

原文由 Willy Goat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 862
1 个回答

c++17 尚未最终确定。并且各种编译器还没有完全实现它。

-std=c++17 意思是“给我你已经完成的所有 C++17”,而不是“成为一个完全有效的 C++17 编译器”。

此时您的编译器和/或标准库不支持此功能。几周/几个月/几年后再回来查看。

没有普遍接受的“如果你完全支持,请给我 C++17,否则给我一个错误”标志,你可以传递给编译器;部分原因是它几乎没有实际用途。如果他们提供的 C++17 子集足够,那么你就赢了。如果您需要一个完全兼容的编译器,特定版本的编译器不知道它们是否有错误,因此您无论如何都不能信任该标志,并且必须针对编译器版本对其进行测试。而且,如果您已经知道哪些版本的编译器具有足够有效的 C++17,则不需要标志来告诉您。

原文由 Yakk - Adam Nevraumont 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题