gpt4 book ai didi

c++ - 虚拟成员函数对现代 CPU 中的局部性是好是坏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:25 25 4
gpt4 key购买 nike

考虑到带有新移动指令和新内存 Controller 的新 CPU,如果在 C++ 中我有一个 Derived 对象的 vector ,其中 Derived 由虚拟成员函数组成,这对本地来说是好事还是坏事?

如果我有一个指向基类 Base* 的指针 vector ,我在其中存储对从 Base 向上 1-2-3 级的派生对象的引用?

基本上动态类型适用于这两种情况,但哪种情况更适合缓存和内存访问?

我更喜欢这两者,但我希望看到有关该主题的完整答案。

在过去的 2-3 年中,硬件行业有哪些新的突破性进展?

最佳答案

在 vector 中存储 Derived 而不是 Base * 更好,因为它消除了一个额外的间接级别,并且您将所有对象“一起”放置在一个连续的内存中,这反过来又使硬件预取器的工作更轻松,有助于分页、TLB 未命中等。但是,如果您这样做,请确保您不会引入切片问题。

至于这种情况下的虚拟分派(dispatch),除了 «this» 指针所需的调整外,几乎无关紧要。例如,如果 Derived 覆盖了您正在调用的虚函数并且您已经有一个指向 Devied * 的指针,则不需要进行 «this» 调整,否则它应该调整为基类的 «this» 值之一(这也取决于继承层次结构中类的大小)。

只要 vector 中的所有类都具有相同的重载,CPU 就能够预测发生了什么。但是,如果您混合使用不同的实现,那么 CPU 将不知道为每个下一个对象调用什么函数,这可能会导致性能问题。

并且不要忘记在进行更改之前和之后始终进行概要分析。

关于c++ - 虚拟成员函数对现代 CPU 中的局部性是好是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108718/

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