C++ 为什么memcpy()是向“std::map”添加元素的一种方法?

C++ 为什么memcpy()是向“std::map”添加元素的一种方法?,c++,arrays,dictionary,std,stdmap,C++,Arrays,Dictionary,Std,Stdmap,我一直在尝试为线程之间的共享访问创建一个容器。我想我要找的是这样的东西: std::map<int, std::array<char, 256>>msg_buffers; //make atomic std::mapmsg\u缓冲区//制造原子 线程将用来传递信息的(原子)数组的映射。但问题是,我发现我可以将值复制到映射引用的数组中,它们看起来就像我正常添加了元素一样。我有一种感觉,这将导致以后的问题,然而,我很好奇为什么它不会导致错误,或者为什么它会工作 这就是它

我一直在尝试为线程之间的共享访问创建一个容器。我想我要找的是这样的东西:

 std::map<int, std::array<char, 256>>msg_buffers; //make atomic
std::mapmsg\u缓冲区//制造原子
线程将用来传递信息的(原子)
数组的映射。但问题是,我发现我可以将值复制到映射引用的数组中,它们看起来就像我正常添加了元素一样。我有一种感觉,这将导致以后的问题,然而,我很好奇为什么它不会导致错误,或者为什么它会工作

这就是它看起来的样子:

#include <array>
#include <map>

std::map<int, std::array<char, 256>>charmap; //a msg queue

char charbuf[256]; //incoming msg buffer
for (int x = 0; x < 256; x++)charbuf[x] = '0'; //make arbitrary msg

//memcopy arbitrary msg **directly** to array at (non existing) map[4]
memcpy(charmap[4].data(), charbuf, sizeof(char) * 256);

//which will then magically exist
std::cout << "Used slots in charmap are: ";
if (!charmap.empty()) 
    for (auto x : charmap)std::cout << x.first << " | "; //cout existing elements
#包括
#包括
std::mapcharmap//消息队列
char-charbuf[256]//传入消息缓冲区
对于(intx=0;x<256;x++)charbuf[x]=“0”//任意制造味精
//memcopy任意消息**直接**到数组(不存在)映射[4]
memcpy(charmap[4].data(),charbuf,sizeof(char)*256);
//然后它就会神奇地存在

std::cout
charmap[4]
返回对键为
4
的值的引用(如果元素还不存在,它会自动创建该元素)。此值的类型为
std::array
,可以正常操作。memcpy只是将内容复制到这个缓冲区中,这里没有memcpy的魔力。特别是,它不会创建新元素。

@tkausl这就是答案,谢谢你。换言之,
memcopy
不是这里的一部分:只是调用
charmap[4]
强制(如果需要)创建相应的值。然后您可以根据需要处理该值。@GianPaolo:此外,如果
memcpy
正在创建任何内容,则在
charmap[4]
上调用
data()
将不起作用。您的答案缺少有关运算符[]的一些关键信息。如果键“4”的键值对不存在,则运算符[]将创建一个新的映射项。因此,无论键在调用运算符[]之前是否存在,它都将始终返回有效的值引用。因此
memcpy
工作时不会触发内存异常(segfault/访问冲突)。@Nathilion