【发布时间】:2017-07-11 13:22:10
【问题描述】:
我正在创建一个静态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(),但在调用分配器函数时无论如何都会溢出堆栈(它可能无论如何都会将所有元素推入堆栈)
【问题讨论】:
-
我不清楚是什么导致了这个问题。只是将参数推送到堆栈的过程会导致它溢出吗?
-
这张地图的内容看起来可以通过 const 初始化存储在有序数组中。
-
@FrançoisAndrieux 我猜。这在 GCC/LLVM 下不会发生。
-
数据排序了吗?地图是否在运行时接收新条目?
-
@RetiredNinja 这听起来像是一个糟糕的选择,因为它没有存储在堆栈中(根据 std::unorderd_map 的设计)。只是临时入栈的初始化列表