我一直在尝试创建一个用于线程之间共享访问的容器。我认为我正在寻找的东西看起来像这样:
std::map<int, std::array<char, 256>>msg_buffers; //make atomic
(原子)array<char,256>
的 map 线程将用来中继信息。但问题是,我发现我可以将值复制到映射引用的数组中,它们看起来就像我正常添加元素一样。不过,我有一种感觉,这会导致以后出现问题,而且我很好奇为什么它不会导致错误,或者为什么它能起作用。
这就是它的样子:
#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()
的元素即使我没有专门创建该元素,也会正常显示。这是编译器在我不知情的情况下所做的事情吗?我看不出这是一种向 map 添加元素的方式,我觉得它应该发出某种警告。
我使用 Visual Studio 2017 来编译它。
最佳答案
charmap[4]
返回对键 4
的值的引用(如果该元素尚不存在,它会自动创建该元素)。该值的类型为 std::array<char, 256>
,可以正常操作。 memcpy 只是将内容复制到该缓冲区中,这里的 memcpy 没有什么魔力。特别是,它不会创建新元素。
关于c++ - 为什么 memcpy() 是一种向 `std::map` 添加元素的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45863832/