Ограничения алиасов указателей

Ключевое слово restrict представляет собой расширение для использования при описании указателей. Этот модификатор приводит к тому, что программист "сообщает" компилятору, что область памяти, на которую указывает restrict-указатель, может быть изменена только посредством данного указателя и никаким другим образом. Это позволяет компилятору выполнять определенные оптимизации кода с учетом того, что некоторый объект не может быть изменен через другой указатель. (Действие модификатора restrict противоположно действию модификатора const. При использовании последнего объект не может быть изменен с использованием самого указателя, объявленного как const, но может быть изменен через другой указатель.)

Гарантируется, что в область памяти, куда указывает указатель, объявленный с модификатором restrict, он будет получать доступ в первую очередь (по сравнению с другими указателями).

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

void fir(short *n, short *c, short *restrict out, int n);

Если out не объявить restrict, то компилятор предполагает, что он может совпадать с n или c и возможности оптимизации кода могут быть несколько ограничены, т.к. приемник совпадает с одним из операндов. Объявление restrict out говорит компилятору о том, что на область памяти out указывает только out.

Поведение программы будет непредсказуемым, если в программе присутствует присваивание между двумя restrict-указателями (т.е. принудительное создание алиасов), за исключением передачи такого указателя в качестве аргумента функции.

Массивы переменной длины

Компилятор cc21k поддерживает массивы переменной длины, которые всегда размещаются в стеке (в памяти данных). Обычно массивы переменной длины представляют собой локальные переменные процедур с длиной, которая передается в функцию в виде ее аргумента вызова. Область видимости такого массива и время его жизни – сама функция. Размер вычисляется при передаче управления в функцию для резервирования места в стеке. Для доступа к массивам (особенно многомерным) компилятор должен сгенерировать код для хранения и использования размерности по каждой переменной. Компилятор генерирует код для отслеживания выхода за границу массива и если такая ситуация встречается, то происходит перераспределение памяти для хранения массива.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: