在堆栈溢出中分配大的静态std :: unordered_map结果

时间:2017-07-11 13:22:10

标签: c++ c++11

我正在创建一个静态std::unordered_map,如下所示:

 auto* __epsgMap__ = new std::unordered_map <int/*EPSG*/, CRS::Info> ({

{3819, CRS::Info("HD1909","+proj=longlat +ellps=bessel +towgs84=595.48,121.69,515.35,4.115,-2.9383,0.853,-3.408 +no_defs")},
{3821, CRS::Info("TWD67","+proj=longlat +ellps=aust_SA +no_defs")},
{3824, CRS::Info("TWD97","+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs")},
{3889, CRS::Info("IGRS","+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs")},
{3906, CRS::Info("MGI 1901","+proj=longlat +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +no_defs")},
{4001, CRS::Info("Unknown datum based upon the Airy 1830 ellipsoid","+proj=longlat +ellps=airy +no_defs")},
...
...
});

此映射有5k +条目,因此,在MSVC上,分配它会导致堆栈溢出(我猜它会在堆栈上推送std::initializer_list。)

我怎样才能分配这个,而不是连续调用insert()

**编辑**

试图在一个分配器函数中执行此操作并连续调用std::unordered_map::insert(),但是当调用allocator函数时它仍会溢出堆栈(它可能会将所有元素推送到堆栈中)

1 个答案:

答案 0 :(得分:3)

似乎问题仅在于地图的初始化程序所在的位置。我建议你将它移动到一个静态数组,并使用适当的unordered_map构造函数来创建地图:

static std::pair<int/*EPSG*/, CRS::Info> const map_init[] = {

{3819, CRS::Info("HD1909","+proj=longlat +ellps=bessel +towgs84=595.48,121.69,515.35,4.115,-2.9383,0.853,-3.408 +no_defs")},
//...
};

auto* epsgMap = new std::unordered_map <int/*EPSG*/, CRS::Info>(std::begin(map_init), std::end(map_init));
BTW,始终为实现保留以一对前导下划线开头的标识符。因此,我删除了他们的代码示例。

另外,我不知道你为什么需要动态分配地图,但C ++函数本地静态对象总是只在控件首次通过时初始化。由于std::unordered_map已经自己分配了内存,因此额外的分配似乎是多余的。您可能希望将地图更改为值:

static std::unordered_map<int/*EPSG*/, CRS::Info> epsgMap(
   std::begin(map_init), std::end(map_init)
);