2012-03-05 4 views
0

Если вы не читаете значение, но назначая значениеявляются операции инициализации массива в кэше, а

, например

int array[] = new int[5]; 

for(int i =0; i < array.length(); i++){ 
array[i] = 2; 
} 

Все равно массив пришел в кэш? Не может ли процессор привести элементы массива один за другим в свои регистры и выполнить назначение, а после этого записать обновленное значение в основную память, за счет кэширования, потому что в этом случае это не обязательно?

ответ

1

Ответ зависит от протокола кэша, на который я ответил, предполагая, что Write Back Write Allocate.

Массив будет по-прежнему поступать в кеш, и это изменит ситуацию. Когда кэш-блок извлекается из него больше, чем просто одно место памяти (фактический размер зависит от дизайна кеша). Так как массивы хранятся по порядку в памяти, потянув в массив [0], он потянет остальную часть блока, которая будет включать (по крайней мере некоторые из) массив [1] массив [2] массив [3] и массив [4]. Это означает, что следующие вызовы не будут иметь доступа к основной памяти.

Также после этого значения НЕ будут записаны в память сразу (при записи), вместо этого ЦП будет продолжать использовать кеш в качестве памяти для чтения/записи, пока этот блок кэша не будет заменен из кеша, в котором то значения будут записаны в основную память.

В целом, это предпочтительнее, когда вы каждый раз переходите в память, потому что кеш намного быстрее, и есть вероятность, что пользователь будет использовать память, которую он только что установил относительно скоро.

Если протокол Write Through No Allocate, это не приведет блок в память, и он будет прямо прямо в основную память.

 Смежные вопросы

  • Нет связанных вопросов^_^