【发布时间】:2018-02-02 11:12:31
【问题描述】:
我一直在尝试为线程之间的共享访问创建一个容器。而且我认为我正在寻找的东西看起来像这样:
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 编译。
【问题讨论】:
-
@tkausl 这就是答案,谢谢
-
换句话说,
memcopy不是这里的图片的一部分:只是调用charmap[4]强制(如果需要)创建相应的值。然后,您可以根据需要处理该值。 -
@GianPaolo:此外,如果
memcpy正在创建任何东西,那么在charmap[4]上调用data()将不起作用。
标签: c++ arrays dictionary std stdmap