C++ jest niskopoziomowy to możesz w takim vektorze objekty przechowywać lub wskaźniki na obiekty, co wtedy w drugim przypadku każdy obiekt będzie gdzieś indziej bo tak allokator mógł przydzielić, a w pierwszym przypadku będzie jeden blok pamięci continoius gdzie będą wszystkie obiekty.
Są plusy i minus, gorzej jest dodawać nowe elementy, chyba że z zapasem się zarezerwuje, usuwanie też jest utrudnione, a przy pointerach jest łatwiej bo jak usuniesz to łatwiej przesunąć pamięć.
Cache jest też set associative w cpu i adres zależy od setu w jakim się znajdzie i może być do przykładowo 8 elementów cache w jednym secie więc dopiero jak się wypchnie poprzednie dane z cache to następne odwołanie pod ten sam adres będzie wolniejsze, stosuje to się przy atakachach side channel gdzie celowo nadpisujesz cały cache i potem porównując czas dostępu możesz przewidzieć do czego uzyskał inny proces dostęp, gdyż on ponownie sprawi, że dany adres się załaduje do cache przez użycie tego.
Albo np. w starych atakach robiło się instrukcję, która powodowała crash, ale ty kontrolowałeś tablicę i index pointera, gdzie indexem była wartość kernela, gdzie procesor wykonując obliczenia do przodu i w razie błędu rollback to załadowywał strony cache, które można było badać, której tablicy był każdy element wielkości cache line i jak kernel dostał seqfault to ty badając który element tablicy ma szybki dostęp mogłeś przewidzieć jaki jest bajt w pamięci kernela.
Działało to na zasadzie branch prediction gdzie procesor miał rozgałęzienia i błędnie przewidział co ma się wykonać wywoływał ahead wyciągnięcie bajta z pamięci i użycie go do dostępu do tablicy, co skutkowało załadowaniem tego elementu, który był o wielkości cache line do cache i potem był rollback lub crash i drugi program mający dostęp do tego regionu sobie badał, ile czasu zajmuje dostęp do każdego elementu i ten, który był najkrótszy to był bajt, który znajdował się w pamięci kernela.
Przy continous memory, cache jak ładuje jeden cache line to jest optymalizacja, która ładuje automatycznie też następny obok cache line, więc jak dane leżą obok siebie to jak korzystasz z jednego fragmentu to już procesor ładuje następny obok, jak przejdziesz na następny załadowany to ładuje w tym czasie już następny.
Ogólnie procesor ma wiele funkcji przewidywania, nawet nie wszystkie są udokumentowane bo są na poziomie hardware, w apple było pełne błędów, gdzie każdy pointer jaki występował w danym cache linie, który procesor właśnie wykonywał instrukcje to z góry ładowało wszystkie adresy do pamięci i to było jednym z kluczowych elementów side channel attaku na tą platformę, ale jakoś ją potem zpatchowali.