c ++ 11 std :: std :: atomic zero数组初始化失败编译?

mar*_*rkd 8 gcc g++ c++11

在g ++ 4.7和g ++ 4.8.2下使用零初始化原子编译下面需要数小时.默认初始化的原子和零初始化的非原子编译立即.

#include <iostream>
#include <array>
#include <algorithm>
#include <atomic>

int main(int argc, char* argv[]) {

    //std::array<std::atomic<int>, 1000000>  arr;         // default initialization (i.e., random data) = FAST

    //std::array<int, 1000000>  arr={{}};     // zero init non-atomic = FAST

    //std::array<std::atomic<int>, 1000000>  arr{{}};   // zero initialization = FOREVER

    //std::array<std::atomic<int>, 1000000>  arr={{}};     // zero init via assignment = FOREVER

    std::array<std::atomic<int>, 1000000>  arr{};   // zero initialization = FOREVER

    std::cerr << "sum = " << std::accumulate(arr.begin(), arr.end(), 0) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

g++ -std=c++11 array.cpp

是手动memset数组的唯一选择吗?

小智 2

用GDB在忙的时候打入GCC,显示卡在了split_nonconstant_init_1,代码中包含一条注释:

FIXME:有序移除的时间复杂度为 O(1),因此整个函数在最坏情况下是二次函数。

(O(1) 可能是一个拼写错误,该函数是 O(N),如果它是 O(1),则注释就没有意义。)

所以,是的,这是一个编译器错误,而且是已知的。然而,我还没有检查 GCC bugzilla 来看看他们是否已经有一个简单的测试用例;如果他们不这样做,您可能需要举报。

至于您现在可以做什么,对您问题的评论表明您已经有了合适的解决方法。