Процессор будет кэшировать все данные, которые ему нужны, и поскольку его размер ограничен, когда ему нужно загрузить что-то новое, он отбросит все, что использовалось меньше всего.
По сути, вы не имеете прямого контроля над ним, но косвенно у вас есть некоторые:
Что вам нужно знать, так это то, что процессоры используют строк кэша . Каждая строка кэша представляет собой небольшой блок памяти.
Так что, если процессору нужны некоторые данные, он извлечет весь блок. Итак, если у вас есть данные, которые очень часто используются и обычно бывают разбросаны в памяти, вы можете поместить их, например, в структуру, чтобы эффективное использование кэша ЦП было лучше (вы кешируете меньше вещей, которые на самом деле требуется). Примечание: в 99,99% случаев вам не нужны такие оптимизации.
Более полезным примером является прохождение 2d-массива, который не помещается в кеш. Если вы идете по ней линейно, вы загружаете каждую строку кеша один раз, обрабатываете ее, и через некоторое время процессор ее отбрасывает. Если вы неправильно используете индексы, каждая строка кэша будет загружаться несколько раз, и поскольку доступ к основной памяти медленный, ваш код будет на lot медленнее. Процессор также может лучше выполнять предварительную выборку, если вы идете линейно (направление не имеет значения).
Работа кэша также может быть нарушена путем вызова некоторой внешней библиотеки, которая требует большого количества данных и / или кода, поэтому ваша основная программа + данные будут удалены из кэшей, и когда вызов завершится, ЦПУ должен загрузить его снова.
Если вы выполняете тяжелую оптимизацию и хотите знать, как вы используете кэш L1 / L2 / .., вы можете делать симуляции. Valgrind имеет отличный модуль под названием Cachegrind , который делает именно это.