gpt4 book ai didi

c++ - 指针映射与结构/容器映射 (C++)

转载 作者:可可西里 更新时间:2023-11-01 17:37:13 26 4
gpt4 key购买 nike

我正在上数据结构类(class),在教授的所有示例中,他总是使他的映射具有指向结构或容器的指针的值,而不是保存结构或容器本身。

他只是养成了习惯,还是有充分的理由(例如速度提高)?

  • 我知道您可以使用指向数据的指针来避免拥有冗余的数据拷贝,但仍然同时在多个容器/结构中包含指向该数据的方向。
  • 在这些示例中,情况并非如此。数据仅在该 map 中。

最佳答案

在我看来,决定是使用指针还是使用对象涉及许多因素:

<强>1。您是否需要多态性?

如果你想维护一个基类对象的容器,然后在其中存储各种派生类的对象,你必须使用指针,否则虚函数调用将无法正确解析。

<强>2。您存储的对象的大小及其对复制操作的适用性

指针优于对象的一个​​关键原因是,在容器上执行的各种操作都涉及制作存储在其中的对象的拷贝。许多存储操作(例如 std::vector<>::push_back()std::map<>::insert())、一些检索操作(例如 std::vector<>::operator[],然后将对象存储在局部变量中)以及容器执行的一些操作都是这种情况“内部”,例如当 vector 超出其容量时重新分配 vector ,或重新散列 std::unordered_map<> .请注意,复制操作可能不太重要,具体取决于您如何选择容器以及如何使用它(例如,使用 std::vector<>::reserve() 分配足够的空间,使用 std::vector<>::emplace_back() 进行存储,并且从不制作检索到的元素的本地拷贝可能意味着永远不会制作拷贝)。

但是,如果您希望生成大量拷贝(或者如果分析现有代码显示生成了很多拷贝),使用指针而不是对象显然会有所帮助,因为指针很小并且在内存中对齐良好。话又说回来,如果您存储的对象实际上小于指针,这将没有多大意义。

<强>3。您对容器及其内容执行的其他操作

即使您正在处理的对象比指针大,并且您希望进行大量的复制操作,使用指针也不一定是可取的。考虑这样一种情况,您存储了大量中等大小的对象(例如,每个对象 16 个字节)并且您经常需要遍历整个容器并执行某种统计计算。当您将这些对象直接存储在一个 vector 中时,您可以在迭代期间获得很高的缓存效率:当您检索一个对象时,将从内存中检索整个缓存行,因此可以更快地检索下几个对象。使用指针时通常不会出现这种情况;相反,在检索到一个元素后,必须取消引用指针,从而导致从可能未缓存的内存区域进行另一次移动操作。

很明显,这完全取决于您存储的对象的类型和大小,以及您执行的操作的类型和频率。如果您处理的对象是 GUI 应用程序的各种类型的窗口、按钮和菜单,您很可能希望使用指针并利用多态性。另一方面,如果你正在处理由紧凑元素组成的巨大结构,所有元素的大小和形状都相同,并且你执行的操作涉及频繁迭代或批量复制,那么直接存储对象是可取的。也可能有这样的情况,如果不尝试两者并根据内存和时间基准的结果做出决定,则很难做出决定。


最后一点,如果您最终使用指针,请考虑您正在构建的容器是否是您在堆上分配的对象的最终所有者,或者只是维护临时指针。如果容器是这些对象的所有者,建议您使用智能指针而不是原始指针。

关于c++ - 指针映射与结构/容器映射 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com