在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数组的唯一选择吗?
答案 0 :(得分:2)
当GDB忙碌时突破GCC会显示它卡在split_nonconstant_init_1
中,其中代码包含注释:
FIXME:有序删除是O(1)所以整个函数是最坏情况的二次方。
(O(1)可能是一个错字,函数是O(N),如果它是O(1)则注释没有意义。)
所以,是的,这是一个编译器错误,而且已经知道了。但是,我还没有检查GCC bugzilla,看看他们是否已经有一个简单的测试用例;如果他们不这样做,你可能想报告。
至于你现在可以做什么,你问题的评论表明你已经有了合适的解决方法。