4MB?
Eine Cacheline ist auf dem x86/x64 wohl 64Byte groß. Die CPU lädt schon im voraus, wahrscheinlich sogar gelegentlich über die Cacheline voraus, aber 4MB ziemlich sicher eher nicht. Das wäre beinahe ja größer als der gesamte CPU Cache egal ob L1, L2, L3. Ansonsten will ich nichts anderes behauptet haben.
Einen Nachteil den ich halt "
std::unordered_map" anrechne, ist halt, die noch schlechtere Ausnutzung des Speichers. Die enthaltenen Objekte verteilen sich ja nie gleichmäßig über die gesamte Hash-Tabelle sondern es sind entweder noch Einträge leer -> Das heißt viel nutzloser Speicher wandert beim Zugriff mit in dem Cache und steht dem restlichen Programm nicht zur Verfügung oder aber, es beginnen sich auch wieder mehrere Elemente in einem Eintrag zu sammeln, das heißt O(1) ist nicht mehr gegeben. Und um das zu Verwalten sind wieder Zeiger/Allokationen nötig. "
std::unordered_map" wurde, soweit ich weiß, für größere Datenmengen entworfen. Um sicher zu entscheiden was im Vorteil liegt, ist gewissenhaftes Testen und darauffolgendes Profiling in der Praxis notwendig.
Aber beim einmaligen Anlegen auch mein vorsortierter-Array/Vector-Vorschlag. Keine Lücken, kein verschwendeter Speicher oder Cache, keine überflüssigen Allokation, nichtmal sinnlose Zeiger. Bei dauernder Änderung des Inhalt schnell natürlich so gut wie unbrauchbar.