我一直在尝试为线程之间的共享访问创建一个容器。我认为我正在寻找的东西看起来像这样:
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来编译它。
答案 0 :(得分:2)
charmap[4]
返回带有键4
的值的引用(如果元素尚不存在,它将自动创建该元素)。该值的类型为std::array<char, 256>
,可以正常操作。 memcpy只是将内容复制到此缓冲区中,并且memcpy没有神奇之处。特别是,它不会创建新元素。