1

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

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

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

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

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

4

4 回答 4

5

这里没有理由使用指针。无论向量中的元素数量如何,向量对象都将具有相同(小)的大小。

该向量已经包含一个指针,该指针指向存储数据的空间。该空间是动态分配的(来自免费存储,假设您不采取措施更改它)。

于 2013-01-09T06:28:42.497 回答
3

向量是动态数组。它的 sizeof 是恒定的,不管它的大小。无论如何都不需要使用指针。

于 2013-01-09T06:27:47.997 回答
2

问题实际上是选择正确的 STL 容器而不是指向容器的指针。引用以下书上的话Effective STL

vector、list 和 deque 为程序员提供了不同的复杂性权衡,应该相应地使用,vector 是默认使用的序列类型,list 应该在序列中间频繁插入和删除时使用, deque 是当大多数插入和删除发生在序列的开头或结尾时选择的数据结构。

Does an experienced programmer always love to use pointers?

智能指针非常方便,实际上我们主要使用智能指针而不是new/delete对原始指针进行操作

于 2013-01-09T06:38:29.733 回答
1

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

在考虑速度时,例如在游戏引擎中,您将尽可能多的内存放在一起,并确保在需要它之前加载它,并在不需要它时卸载它。您希望防止内存变得碎片化并在缓存惩罚上受到更多打击。当你试图保持一定的帧率时,比如 30 fps,你真的不想让这个变化太大(这会发生在很多缓存未命中或内存移动的情况下)。使用std::vector,您可以按照某人的建议执行此操作,提前分配,尝试分配足够多或比您需要的多一点,稍后调整大小会很痛苦,在游戏运行期间,这可能是一个巨大的不-不。

无论如何,有时拥有一个大型对象数组/向量会更有效,即使您必须遍历它们才能找到所需的对象,如果这意味着不发生缓存未命中。如果内存被加载,在顺序存储时从一个对象跳转到另一个对象是相当快的。此外,例如,在具有 (int) id 的事物上,执行 vectorObject.at(id_location) 是恒定的时间,如果没有缓存问题,速度很快。

另一方面,有时最好有一个加载的 std::map 例如包含指向一个非常大的向量的指针,这可能会产生很多缓存未命中(如数据库大小)。与遍历向量 (n) 时间相比,遍历 map 需要 lg(n) 时间,然后通过指针跳转到记录位置更有效,即使是一次缓存未命中也是如此。它胜过遍历整个硬盘,产生催人泪下的缓存。

这当然是永恒的问题,根据您的需要决定什么是正确的。知道避免缓存未命中可以帮助您做出更好的决定,因为您可以确定这不是您最后一次需要考虑它。

于 2013-01-09T12:33:39.663 回答