jb.*_*jb. 3 c++ linux gcc c++11
我想创建一个大的std::array并用随机数据填充它.问题是如果我声明std :: array program segfaults(GDB说它是segfaults auto start..),如果我评论数组声明程序运行.
这是SCSE:
#include <array>
#include <cstdint>
#include <iostream>
#include <chrono>
static const constexpr size_t size = 1E7;
int main(){
auto start = std::chrono::high_resolution_clock::now();
std::array<uint16_t, size> random_data;
// Here I want to fill random_data with random numbers to avoid
// filling memory twice
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end-start;
std::cout << "Elapsed sec " << elapsed.count() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它是-std=gnu++11在GNU/Linux上使用gcc编译的.
Col*_*mbo 10
你的array谎言在堆栈上,它的成员,底层数组也是如此.但是你机器上的堆栈大概不是四十兆字节,所以你的程序崩溃了.
使用vector.
std::vector<std::uint16_t> random_data(size);
Run Code Online (Sandbox Code Playgroud)
或者,如果要避免不必要的初始化并且不需要动态更改大小,请使用unique_ptr保持数组.
std::unique_ptr<std::uint16_t[]> random_data( new std::uint16_t[size] );
Run Code Online (Sandbox Code Playgroud)
演示.