我正在使用map<string,string>
类型的全局声明。
-
#include <iostream>
#include <map>
#include <string>
std::map<std::string, std::string> mymap;
class myObject
{
public:
myObject()
{
mymap["A"] = "AString";
mymap["B"] = "BString";
mymap["C"] = "CString";
}
};
int main()
{
myObject obj1;
std::cout << mymap["B"] << std::endl;
return 1;
}
答案 0 :(得分:0)
有一个固定大小的对象代表地图本身,你已经创建了全局(与静态相同的存储类型)。这将有一些指向动态内存的指针,其中包含地图的可变大小内容。这包括动态内存中的字符串,还包括动态内存中的其他内容(依赖于实现)。
答案 1 :(得分:0)
对这个问题的正确,完整的答案可能比人们想象的更复杂。我会给你一些提示:
C ++标准将内存管理的细节留给了实现。你应该不要太在意这个。专注于应用程序逻辑的语义,并将内存管理留给编译器。
与原始数组(或std::array
)不同,std::map
和std::string
(实际上,std::basic_string
)是容器,其大小可在执行期间更改,所以这些类通常(但不总是,见下文)不能包含所有元素本身。它们将包含一个指向动态分配内存的指针,其中保留实际内容。 (sizeof
)std::map
和std::string
对象本身的大小与其当前内容无关。
对于动态分配,std::map
和std::string
默认使用std::allocator
。 std::allocator
uses placement new分配内存(不是new[]
)。
理论上,你可以使用自定义分配器而不是默认分配器,以完全不同的方式执行任何内存分配,尽管很少这样做。
std::string
可以使用Small-String Optimisation (SSO)实现,在这种情况下,对于小字符串,根本就会有 no 动态分配。 Visual C ++使用这种技术。
写入时复制(COW)是另一种实现字符串的传统方式,它基于相同的字符串可以共享相同的动态分配内容的想法。在这种情况下,多个std::string
对象中的指针将指向相同的地址。但是,这种技术在多线程场景中一直是有问题,并且C ++ 11实际上已经不允许这样做了。我刚刚提到它是为了完整。
从C ++ 11开始,std::string
的内容正式要求连续,即在内存中依次存储,以便您可以获取地址第一个元素,并将内容视为数组。
答案 2 :(得分:0)
实际上这张地图&lt; string,string&gt;需要移动到共享内存,所以想知道内存是如何分配的,如果我想用字符串移动地图,我需要遵循不同形式的内存管理。
如果有人知道如何实现这一目标,请告诉我。