如果 Class 在 VC 编译器中包含 std::map 等容器,它的内存布局是什么

what's the memory layout of a Class if it contains Containers such as std::map, in VC compiler

ClassA{
public:
std::map<int,int> m_map;
...
...
};

我试过 visual studio 中的 /d1reportSingleClassLayout 但无法真正解码输出:

1> 0 | ?$map@HHU?$less@H@std@@V?$allocator@U?$pair@$$CBHH@std@@@2@ m_map
1>28 | ......

我的理解是容器的大小不固定,所以在ClassA的Obj的内存布局中,应该存在指向堆中实际m_map内容的指针?

std::map 实现的精确布局取决于编写标准库的人员。它不是由 C++ 定义的。

您可以在您的构建机器上研究标准 headers,或者您可以简单地忘记它并改为编写标准 API。

但是,是的,那里某处会有一两个指针,指向动态分配的内存。可能很多。

回答您的问题:

  1. 堆中会不会有指向m_map的指针?这个问题只有std::map的制造者才能知道回答。我会说是的,但你最终必须查看 map 的实现才能找到它。为了使地图动态增长,必须有一个指针。

  2. ClassA的默认析构函数会自动释放分配给m_map的space吗?是的,他们设计时考虑到了这一点,因此程序员不必担心内存问题。但是,它执行此操作的方法也在 std::map.

  3. 的实现中

我认为不要太担心这个是明智的。 API旨在减轻您提到的担忧。