Это помечено языком, но я действительно не верю, что это так.Этот пост отвечает на вопрос на C и C ++.
Оптимизирующий компилятор может позаботиться о доступе к «голому» массиву;в C или C ++ нет причин полагать, что компилятор не запомнит значение ячейки памяти, если между ними не было вызвано ни одной функции.Например,
int a = myarray[19];
int b = myarray[19] * 5;
int c = myarray[19] / 2;
int d = myarray[19] + 3;
Однако, если myarray не просто определен как int [], но на самом деле является чем-то «причудливым», особенно некоторый определенный пользователем тип контейнера с функцией operator[]()
, определенной в другой единице перевода, то этофункция должна вызываться каждый раз, когда запрашивается значение (поскольку функция возвращает данные в определенном месте в памяти, а локальная функция не знает, что результат функции должен быть постоянным).
Хотя даже с «голыми» массивами, если вы обращаетесь к одной и той же вещи несколько раз при вызове функций, компилятор также должен предположить, что значение было изменено (даже если он может запомнить сам адрес).Например,
int a = myarray[19];
NiftyFunction();
int b = myarray[19] * 8;
Компилятор не может знать, что myarray [19] будет иметь одинаковое значение до и после вызова функции.
Вообще говоря, если вы знаете, чтозначение является постоянным в локальной области видимости, «кеширует» его в локальной переменной.Вы можете программировать с защитой и использовать утверждения для проверки того условия, которое вы наложили на вещи:
int a = myarray[19];
NiftyFunction();
assert(myarray[19] == a);
int b = a * 8;
Последнее преимущество заключается в том, что намного проще проверять значения в отладчике, если они не похоронены вмассив где-то.