【发布时间】:2017-05-21 21:09:36
【问题描述】:
我有以下unordered_maps:
struct a{
std::string b;
};
int main()
{
std::unordered_map<std::string, std::string> source;
source["1"] = "Test";
source["2"] = "Test2";
std::unordered_map<std::string, a> dest = *reinterpret_cast<std::unordered_map<std::string, a>*>(&source);
std::cout << dest["1"].b << std::endl;
std::cout << dest["2"].b << std::endl;
}
使用reinterpret_cast 我将source 转换为dest。这是因为struct a 只包含std::string。
我的问题:这实际上是一个好的做法吗? GCC 产生以下警告:
取消引用类型双关指针会破坏严格的别名规则
我可以放心地忽略这个吗?或者只转换 STL 容器的原始字节有什么潜在的缺点吗?
【问题讨论】:
-
你有read about strict aliasing吗?如果编译器给你一个警告,那是有原因的,它告诉你你正在做一些你不应该做的事情。
-
好的,所以在这种情况下 reinterpret_cast 不是一个选项。 (尽管我在不同的 -O 级别上使用 MSVC 和 GCC 编译它并且效果很好)除了实际复制地图还有其他方法吗?
-
复制地图的唯一标准和好的方法是循环遍历第一个元素中的每个元素并将其添加到第二个元素。除非源地图非常大,或者您必须每秒执行数百次,否则它不会真正被注意到。
标签: c++ gcc unordered-map reinterpret-cast