一尘不染

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

algorithm

这个问题已经在这里有了答案

已经实现了C ++ 17并行算法吗? (4个答案)

2年前关闭。

我在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;
}

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


阅读 321

收藏
2020-07-28

共1个答案

一尘不染

c ++ 17尚未完成。并且各种编译器尚未完全实现它。

-std=c++17 表示“将完成的所有C 17给我”,而不是“成为完全有效的C 17编译器”。

目前,编译器和/或标准库不支持此功能。请在几周/几月/几年后再检查一次。

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

2020-07-28