Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在无序的地图中存储大型对象是否效率低下?_C++ - Fatal编程技术网

C++ 在无序的地图中存储大型对象是否效率低下?

C++ 在无序的地图中存储大型对象是否效率低下?,c++,C++,例如,如果您有无序映射和添加项,当无序映射进行重新刷新时,它实际上是在移动大对象数据还是在内部移动指针?使用无序映射是否更好?这取决于std::无序映射的实现。VS的实现将数据存储在链接列表中。因此,它既是好的也是坏的。不好,因为它不是连续的,需要为每个元素分配(如果没有这个问题,很难实现std::unordered_map),但从某种意义上说,它甚至不会移动元素 无论实现如何,除非您希望共享数据所有权,否则不应使用std::shared_ptr。由于额外的分配、大量的指针解引用以及在共享指针的

例如,如果您有无序映射和添加项,当无序映射进行重新刷新时,它实际上是在移动大对象数据还是在内部移动指针?使用无序映射是否更好?

这取决于
std::无序映射的实现。VS的实现将数据存储在链接列表中。因此,它既是好的也是坏的。不好,因为它不是连续的,需要为每个元素分配(如果没有这个问题,很难实现
std::unordered_map
),但从某种意义上说,它甚至不会移动元素

无论实现如何,除非您希望共享数据所有权,否则不应使用
std::shared_ptr
。由于额外的分配、大量的指针解引用以及在共享指针的控制块中处理原子操作,它很可能会大大降低代码的速度


在极端情况下,当元素的大小非常大时,考虑使用<代码> STD::UnQuyJPPT。我看不出任何其他情况下这样做有任何意义(当然,唯恐元素不可移动)。

每个元素都存储在自己的节点中,因此添加/删除元素不会移动现有元素


你怎么知道?只需粗略地看一下公共界面,特别是注意方法和方法。其他更改元素数量的操作没有那么明显。

我认为这将取决于您使用的标准库如何实现无序映射。
。通过编写一个小的tester类,在其move/copy构造函数中打印调试打印,测试无序映射的当前实现应该很简单,等等(当然,这只告诉您自己的STL实现的行为,它不会告诉您其他STL实现可能会做什么)我现在做了一个测试,它没有调用copy-ctor或assignment操作符,所以我假设没有进行任何移动。我在想也许它可以做一个交换。一个链表?几乎没有。这无法满足性能要求。一堆节点?是的。根据对实现的依赖性进行更正,但是您通常希望@deduplication有一个哈希表,或者它将值存储在一个链表中。它还有一个向量(我相信)将hash_值映射到链表中的关联元素。我发现无序映射只需要值是可默认构造的,所以这表明不需要复制。