我想创建一个大std::array
并用随机数据填充它。问题是如果我声明std :: array program segfaults(GDB说它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;
}
在GNU / Linux上使用-std=gnu++11
在gcc中编译。
答案 0 :(得分:10)
你的array
位于堆栈上,其成员,底层数组也是如此。但是你机器上的堆栈大概不是四十兆字节,所以程序崩溃了。
使用vector
。
std::vector<std::uint16_t> random_data(size);
或者,如果您想避免不必要的初始化并且不需要动态更改大小,请使用unique_ptr
持有数组。
std::unique_ptr<std::uint16_t[]> random_data( new std::uint16_t[size] );