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

时间:2014-01-02 14:59:11

标签: gcc c++11 g++

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

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

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

1 个答案:

答案 0 :(得分:2)

当GDB忙碌时突破GCC会显示它卡在split_nonconstant_init_1中,其中代码包含注释:

  

FIXME:有序删除是O(1)所以整个函数是最坏情况的二次方。

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

所以,是的,这是一个编译器错误,而且已经知道了。但是,我还没有检查GCC bugzilla,看看他们是否已经有一个简单的测试用例;如果他们不这样做,你可能想报告。

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