当速度很重要时,为了帮助解决未来的问题,请考虑缓存未命中的内存管理,而不仅仅是查找时间。我同意上述答案,不需要指针,除非您的类大于页面文件的大小。在这种情况下,您可能需要考虑将您的类分解 50 或 100 次,但仍然不使用指针。
在考虑速度时,例如在游戏引擎中,您将尽可能多的内存放在一起,并确保在需要它之前加载它,并在不需要它时卸载它。您希望防止内存变得碎片化并在缓存惩罚上受到更多打击。当你试图保持一定的帧率时,比如 30 fps,你真的不想让这个变化太大(这会发生在很多缓存未命中或内存移动的情况下)。使用std::vector,您可以按照某人的建议执行此操作,提前分配,尝试分配足够多或比您需要的多一点,稍后调整大小会很痛苦,在游戏运行期间,这可能是一个巨大的不-不。
无论如何,有时拥有一个大型对象数组/向量会更有效,即使您必须遍历它们才能找到所需的对象,如果这意味着不发生缓存未命中。如果内存被加载,在顺序存储时从一个对象跳转到另一个对象是相当快的。此外,例如,在具有 (int) id 的事物上,执行 vectorObject.at(id_location) 是恒定的时间,如果没有缓存问题,速度很快。
另一方面,有时最好有一个加载的 std::map 例如包含指向一个非常大的向量的指针,这可能会产生很多缓存未命中(如数据库大小)。与遍历向量 (n) 时间相比,遍历 map 需要 lg(n) 时间,然后通过指针跳转到记录位置更有效,即使是一次缓存未命中也是如此。它胜过遍历整个硬盘,产生催人泪下的缓存。
这当然是永恒的问题,根据您的需要决定什么是正确的。知道避免缓存未命中可以帮助您做出更好的决定,因为您可以确定这不是您最后一次需要考虑它。