Проверяет понимание концепции косвенного доступа к данным через указатели и осознание накладных расходов на разыменование.
Индирекция (косвенность) — это механизм, при котором для доступа к данным используется промежуточный объект, например указатель или ссылка. Вместо прямого обращения к значению программа сначала получает адрес, а затем читает данные по этому адресу. Это фундаментальная концепция в языках C, C++, Rust и других, позволяющая реализовать динамические структуры данных, полиморфизм и передачу больших объектов без копирования.
Нет, разыменование указателя не является бесплатной операцией. Оно включает как минимум одно дополнительное обращение к памяти: сначала читается сам указатель (если он не в регистре), затем по полученному адресу читаются данные. Это может привести к кэш-промаху, если целевые данные не находятся в кэше процессора. В современных архитектурах разница между прямым доступом и доступом через указатель может составлять десятки или сотни тактов.
int a = 42;
int *p = &a;
// Прямой доступ
int x = a;
// Доступ через указатель (индирекция)
int y = *p;
В первом случае компилятор может поместить значение a в регистр. Во втором — сначала загрузить адрес из p, затем выполнить загрузку по адресу. Если p указывает на удалённую область памяти, это вызовет промах кэша.
Индирекция — мощный инструмент для гибкости кода, но её использование должно быть осознанным. В критичных по производительности участках стоит избегать лишних разыменований, особенно в циклах, и учитывать влияние на кэш-память.