如果数组很大,使用指针作为c++类成员是更有效的方法吗?

Is using pointer as c++ class member a more efficient way if the array is large?

本文关键字:成员 有效 方法 c++ 数组 指针 如果      更新时间:2023-10-16

这里有几个关于指针的问题。

class object
{
private:
    vector<point> points_;
}

假设我正在写一个如上所述的类,如果我有很多点,一个长数组,你会建议什么?我应该使用vector<point> points_还是vector<point>* points_ ?

使用指针对c++代码更有效,所以我应该尽可能地使用它?注意:我需要最后的程序越快越好。

经验丰富的程序员总是喜欢使用指针吗?如果效率不是问题,或者不是我关心的问题,我发现不使用指针对我来说更清晰,我发现使用指针总是有很多生命周期问题。由于

这里没有理由使用指针。无论vector对象中有多少个元素,其大小都是相同的(小的)。

vector已经包含一个指向存储数据的空间的指针。该空间是动态分配的(从自由存储区分配,假设您没有采取步骤更改它)。

Vector为动态数组。它的sizeof是常数,与它的大小无关。没有必要使用指针

问题实际上是选择正确的STL容器而不是指向容器的指针。摘自Effective STL

vector、list和deque为程序员提供了不同的复杂性权衡利弊,应该相应地使用,向量是类型的默认情况下应该使用序列,列表时应该使用中间有频繁的插入和删除序列、deque是大多数插入时选择的数据结构删节发生在开头或结尾序列。
Does an experienced programmer always love to use pointers?

智能指针非常方便,在实践中我们大多使用智能指针来代替new/delete对原始指针的操作

当速度很重要时,为了帮助解决未来的问题,从缓存丢失的角度来考虑内存管理,而不仅仅是查找时间。以上答案我同意,不需要指针,除非你的类比一个页面文件大。在这种情况下,您可能需要考虑将类分解50或100次,但仍然不使用指针。

当考虑到速度时,例如在游戏引擎中,你需要将尽可能多的内存放在一起,并确保在需要之前加载它,并在不需要时卸载它。您希望避免内存碎片化,避免在缓存惩罚上遭受更多的命中。当我们试图保持一个特定的帧率时,比如30 fps,你真的不希望这个变化太大(这会发生在大量缓存丢失或内存移动的情况下)。使用std::vector,你可以像别人建议的那样做,提前分配,尝试分配足够的,或者比你需要的多一点,调整大小是痛苦的,在游戏运行期间,这可能是一个巨大的禁忌。

无论如何,有时候拥有一个大的对象数组/向量会更有效,即使你必须遍历它们才能找到你需要的对象,如果这意味着不会导致缓存丢失。如果内存是加载的,那么在顺序存储时从对象跳到对象是相当快的。此外,对于具有(int) id的事物,例如,执行vectorObject.at(id_location)的时间是恒定的,如果没有缓存问题,则速度非常快。

另一方面,有时最好加载std::map,例如包含指向非常大的向量的指针,这可能会导致大量缓存丢失(如数据库大小)。与遍历一个向量(n)的时间相比,遍历一个map的时间是lg(n),然后通过指针跳转到记录位置的效率更高,即使这是一个缓存丢失。它比遍历整个硬盘,产生令人流泪的缓存要好。

这当然是一个永恒的问题,决定什么是正确的取决于你需要什么。知道如何避免缓存丢失可以帮助您做出更好的决策,因为您可以确定这不是最后一次需要考虑这个问题。