【发布时间】:2021-07-28 13:32:07
【问题描述】:
如果我有一个带有默认分配器的 std::map 初始化为无元素,当它被定义为提供一些容量时是否会分配内存?有没有办法在第一次执行插入之前阻止内存分配?我喜欢这种行为,因为我需要经常创建地图,但它通常根本不使用,因此没有插入任何元素。我想只在插入元素时支付内存分配的成本。
即
std::map<string, double> foo{}; // Is there memory allocation here?
【问题讨论】:
-
答案取决于您使用的 STL。
-
你确定一个空地图分配了什么?哪个编译器?
-
我从未尝试过,但你的问题让我想知道:我该如何找到答案?我想我会尝试通过仅定义
allocate(应该“隐藏”基本实现)来继承std::allocator,这样我就可以探测 when它被有效地调用...(allocate的定义只需将调用路由到基本实现)。要使用它,请将其作为std::map的第四个参数传递(并将第三个设置为std::less<std::string>)。那么你应该能够自己回答这个问题......;) -
@Tenphase 也许最简单的方法是重新定义
operator new;现场演示:godbolt.org/z/zK3Eoh3WK。使用我的 MSVC,它输出 40,支持 Artyer 的答案。 -
@DanielLangr 是的,但是您的解决方案很难在已经编写的代码中使用。除非您将
std::map子类化,这甚至会更复杂...通过在单个用户定义的allocator上隐藏allocate,您将能够探测任何特定的实例任何 STL 容器。因此,想法/提议... ;)
标签: c++