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

Wil*_*oat 16 c++ algorithm multithreading 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我想让这个程序多线程,我应该能够用一行来完成.

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;
}
Run Code Online (Sandbox Code Playgroud)

然而,当我第一次尝试这个(有g++ -std=c++17)时,我得到一个错误告诉我‘std::execution’ has not been declared,所以我尝试添加,#include <execution>但它说execution: No such file or directory.我也试过#include<experimental/algorithm>而不是,#include<algorithm>但我得到了相同的结果.我如何使用这个新功能?

Yak*_*ont 12

尚未最终确定.各种编译器还没有完全实现它.

-std=c++17 意思是"给你我完成的所有C++ 17",而不是"是一个完全有效的C++ 17编译器".

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

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

  • 在支持它的任何前沿版本上是否有任何编译器?我试着在后备箱和gcc 7上铿锵作响. (4认同)
  • @cassio 1z是在C++ 17完成之前的; 它可以完全实现标准中发生变化的事情,或者被删除等.17标准何时完成,但您的支持可能不完整.换句话说,MSVC刚刚在最后一个补丁中完成了对C++ 11的支持(忽略了bug) (2认同)