【问题标题】:Why is memcpy() a way to add elements to a `std::map`?为什么 memcpy() 是一种将元素添加到 `std::map` 的方法?
【发布时间】:2018-02-02 11:12:31
【问题描述】:

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

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

(原子)array&lt;char,256&gt; 的映射,线程将使用它来传递信息。但问题是,我发现我可以将值复制到地图引用的数组中,它们看起来就像我正常添加了元素一样。但是,我感觉这会在以后导致问题,我很好奇为什么它不会导致错误,或者为什么它完全有效。

这就是它的样子:

#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 编译。

【问题讨论】:

标签: c++ arrays dictionary std stdmap


【解决方案1】:

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

【讨论】:

  • 您的答案缺少与 operator[] 相关的重要内容。如果键 '4' 的键值对不存在,则 operator[] 创建 一个新的映射条目。因此,无论键在调用 operator[] 之前是否存在,它都会总是返回一个有效的值引用。因此memcpy 工作时不会触发内存异常(段错误/访问冲突)。
  • @Nathilion 澄清
猜你喜欢
  • 2011-08-10
  • 2016-11-09
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2019-08-24
相关资源
最近更新 更多