在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 来看看他们是否已经有一个简单的测试用例;如果他们不这样做,您可能需要举报。
至于您现在可以做什么,对您问题的评论表明您已经有了合适的解决方法。
归档时间: |
|
查看次数: |
782 次 |
最近记录: |