C 指针向量如何影响性能

C++ How does a vector of pointers affect performance?

本文关键字:影响 性能 何影响 指针 向量      更新时间:2023-10-16

我想知道指示对象的std ::向量如何影响程序的性能,而不是使用std :: vector直接包含对象。具体来说,我指的是程序的速度。

我被教导使用std :: vector,而不是其他stl,例如速度的std ::列表,因为所有数据都在存储器中连续存储在内存中,而不是被分散。这意味着迭代元素很快,但是我的想法是,如果我的向量包含对象的指针,那么对象仍然可以存储在内存中的任何位置,并且只有指针存储了连续。我想知道,当涉及向量并访问对象时,这将如何影响程序的性能。

我当前的项目设计使用指针向量,以便我可以利用虚拟功能,但是我不确定当我的向量变得非常大时,这是否值得遇到的速度打击。感谢您的帮助!

如果您需要多态性,如人们所说,您应该将指针存储到基础上。稍后,您确定此代码很热并且需要优化其CPU缓存使用量,则可以通过使对象干净地拟合在缓存道中和/或使用自定义分配器来确保代码的代码局部性来做到这一点。p>切片是当您按值碱存储对象并复制构造或分配到它们中,将切成衍生的,派生的构造函数或分配器仅占据基础,并且会忽略派生中的任何数据,没有足够的空间分配给基地以占据衍生的全尺寸。即,如果基数为8个字节,而派生为16,那么即使您提供了明确进行副本的复制构造函数/分配器,在目标值中的8个字节也只有足够的空间。

我应该说,如果您在使用优化者不省力的虚拟化中使用虚拟化,则实际上不值得考虑数据缓存相干性。指令缓存错过比数据缓存失误更加偏差,而虚拟化可能会导致指令缓存错过,因为它必须在将函数加载到指令中,因此必须查找VTable指针,因此无法先到抢先地加载它们。

> >

cpu的倾向于在加缓存中预装尽可能多的数据,如果加载地址,则整个高速缓存车道(〜64个字节(会加载到缓存车道中,并且通常还会在之前和它加载该速度。之后,人们如此热衷于数据区域。

因此,在加载第一个指针时,在您的指针方案的矢量中,如果您的实际粒子,如果您的实际粒子,可以在缓存中获得很多指针,它会触发缓存并在该对象周围加载数据是16个字节,彼此本地,您不会损失太大。如果它们遍布堆和巨大的堆,您将在每次迭代中都会变得非常缓存,并且在粒子上工作时相对正常。

传统上,粒子系统往往很热并且喜欢紧紧打包数据,通常可以看到16个字节普通的旧数据粒子系统,您可以通过非常预测的分支线性地迭代。这意味着您通常可以依靠每个缓存车道的4个粒子,并让预摘要保持在您的代码领先地位。

我还应该说CPU缓存是CPU依赖性的,我专注于Intel X86。例如,ARM往往落后于Intel&管道不那么复杂,预摘要的功能较低,因此缓存的错过可能不会毁灭性。