int x = 3. Будет ли x в кеше? - PullRequest
       3

int x = 3. Будет ли x в кеше?

0 голосов
/ 26 февраля 2012

Мне недавно задали этот вопрос друг. В программе на C, если я объявляю целое число

int x = 3;

тогда он будет загружен в кеш?

Мое мнение: Да. Так как процессор выделит sizeof(int) количество места в памяти. Затем, чтобы записать 3 в эту ячейку памяти, он получит x в своих регистрах, а затем добавит 3 к нему. Так как x хранится в регистрах ЦП (это, как я думаю, работает), оно также будет извлечено в кеш. Тогда как, если мы только объявляем целое число и не инициализируем его. Например.

int x;

Тогда процессор просто выделяет память и ничего не записывает в эту память, поэтому в этом случае x не будет в кеше. Это может быть обобщено на случай, когда переменная извлекается из кеша. Дайте мне знать, если мое мышление правильно. Спасибо

Ответы [ 5 ]

4 голосов
/ 26 февраля 2012

нет однозначного ответа на это .... но да, более чем вероятно. Существует даже очень хороший шанс, что он будет внесен в реестр. Если это возможно, это позволит избежать памяти и просто сохранить его в реестре!

3 голосов
/ 26 февраля 2012

Если вообще есть оптимизация, вполне вероятно, что 3 никогда даже не попадет в регистр. Скорее компилятор распознает, что x имеет значение 3 и заменит 3 для следующего использования x, возможно, с помощью, например, инструкции немедленного добавления, которая сначала не помещает значение в регистр.

Или компилятор может оптимизировать x в регистр, поэтому значение x никогда не будет храниться в памяти и, следовательно, никогда не будет проходить через кеш.

А некоторые процессоры имеют так называемый «кэш с хранением», что означает, что если x назначено место хранения, значение может быть помещено в это место без первого / одновременного помещения в кэш хранения.

Таким образом, мы можем определенно сказать, что значение 3 может появиться где-то в кэше. Иногда.

1 голос
/ 27 апреля 2012

Во-первых, ЦП не выделяет память для вашей целочисленной переменной, по крайней мере, сам по себе. Выделение памяти - это совместная задача компилятора и ОС. Компилятор генерирует код либо для ЦП, либо для ОС, чтобы выделить память либо в стеке, либо в куче. Затем этот код выполняется и резервирует память.

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

  1. он вообще не попадает в кеш, потому что кеша нет или он отключен
  2. он не попадает в кеш, потому что ни один код не использует эту переменную или любые данные, непосредственно прилегающие к ней, поэтому нет шансов засосать эту переменную в кеш
  3. он может попасть в кеш инструкций вместо кеша данных, если компилятор обнаружит, что эта переменная является константой и может быть непосредственно закодирована в инструкции (пример: int x=3; y+=x; Здесь компилятор может просто сгенерировать код для y+=3 и этот 3 может быть непосредственным операндом инструкции mov или add)
  4. аналогично приведенному выше, компилятор может выяснить, как генерировать оптимизированный код, не требуя когда-либо значения переменной (3) где-либо (пример: int x=3; while(x--) printf("*"); Здесь компилятор может просто сгенерировать 3 вызова printf("*") или даже один звонок printf("***"))
  5. он временно попадает в кеш и после использования вытесняется из кеша другими данными
1 голос
/ 27 апреля 2012

Помимо того, что зависит от реализации, оно также зависит от того, где написано это объявление.Если это глобальная переменная, 3, вероятно, будет просто храниться в сегменте данных исполняемого файла, чтобы он отображался в адресное пространство процесса при запуске программы.В этом случае назначение не «происходит» во время выполнения.

0 голосов
/ 27 апреля 2012

Если x размещено в стеке вместо того, чтобы быть в регистре или оптимизировано полностью, то оно обязательно будет в кешеСтек почти всегда находится в кеше, потому что стек всегда используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...