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

时间:2017-08-24 14:08:03

标签: c++ arrays dictionary std stdmap

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

 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来编译它。

1 个答案:

答案 0 :(得分:2)

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