为什么 memcpy() 是一种将元素添加到 'std::map' 的方法?

Why is memcpy() a way to add elements to a `std::map`?

本文关键字:std 方法 map 添加 memcpy 一种 为什么 元素      更新时间:2023-10-16

我一直在尝试为线程之间的共享访问创建一个容器。我认为我正在寻找的东西看起来像这样:

std::map<int, std::array<char, 256>>msg_buffers; //make atomic

线程将用于中继信息的(原子(array<char,256>映射。问题是,我发现我可以将值复制到映射引用的数组中,它们看起来就像我正常添加元素一样。但是,我有一种感觉,这会导致以后出现问题,我很好奇为什么它不会导致错误,或者为什么它根本有效。

这是它的样子:

#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

添加memcpy()的元素将显示为正常,即使我没有专门创建该元素。这是编译器在我不知道的情况下做的事情吗?我看不出这是如何向地图添加元素的一种方式,我觉得它应该发出某种警告。

我使用Visual Studio 2017来编译它。

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