使用指向对象的指针作为 std::unordered_map 中的值有什么好处?

问题描述 投票:0回答:1

在 youtube 剪辑中 光速交易:用 C++ 设计低延迟系统 - David Gross - Meeting C++ 2022 介绍如下:

std::unordered_map<InstrumentId, Instrument> mInstruments;
// Upsides: Contiguous memory, cheap lookup
// Downsides: Random memory access ("Linked list")

std::vector<Instrument> mInstruments;
std::unordered_map<InstrumentId, Instrument*> mInstruments;
// Upsides: Contiguous memory, cheap lookup
// Downsides: expensive resize which invalidates pointers

为什么这是一个改进?不是还有一个链表,只是现在用指针而不是完整的对象吗?所以你还有随机内存访问?

c++ unordered-map
1个回答
0
投票

论点是,如果所有

Instruments
总大小都大于系统的缓存,则触发缓存未命中的随机访问将有很长的延迟。

在第二种情况下,unordered_map 只能随机访问指针,希望这些指针足够小以完全适合 L1 缓存,当所有数据都已经在 L1 缓存中(或至少如果指针可以放入 L2,会有一些小的延迟)。

乐器呢?你仍然会对它们进行缓存未命中,因为它们无法放入 L1 缓存,但现在你按顺序访问它们,允许 CPU 预取它们,CPU 将正确猜测它需要哪些数据,所以缓存未命中延迟减少了(对于现代硬件来说几乎是原来的十倍)。

© www.soinside.com 2019 - 2024. All rights reserved.