C++ 在编译时已知数据时,在堆栈和堆上分配大映射

问题描述 投票:0回答:1

我读过关于如何处理大型无序映射的相互矛盾的想法,是否根据编译时已知/未知的大小在堆上或堆栈上分配它们。所以希望有人可以一劳永逸地解决这个问题,因为即使我试图将我的大地图移到堆上,visual studio 仍然警告我它需要放在堆上。

defs.cpp

unordered_map<string, string>* Keywords = new unordered_map<string, string>({...});

defs.h

extern unordered_map<string, string>* Keywords;

地图大小为55k,在代码中定义,不会随着app运行而改变。 它只需要存在并可供应用程序的许多部分访问。据我了解,

new
关键字应该已经在堆上分配了?

非常感谢任何帮助,谢谢。

c++ memory-management unordered-map
1个回答
1
投票

std::unordered_map<K,V>
必须为其元素动态分配存储空间。要了解原因,您可以将
sizeof(std::unordered_map<K,V>)
视为编译时间常数。元素不直接存储在地图对象中,而是存储在其他地方。

其他大多数容器也是如此(

std::array
例外)。因此,您几乎不需要动态分配容器。

(假设你这样做了,那么你就不会使用

new
和原始指针。)

© www.soinside.com 2019 - 2024. All rights reserved.