Как вышло, что наложение предполагается по умолчанию?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.09.21 09:23
Оценка:
Внезапно подумалось, почему оптимизаторы C/C++ традиционно исходят из возможности наложения (aliasing) указателей, позволяя явно указать его отсутствие (restrict, __declspec (noalias), __declspec (restrict) и т.п.), но явная возможность указать наличие наложения мало где есть? Соответственно, большинство компиляторов подходит к оптимизации достаточно осторожно, хотя можно было бы оптимизировать и лучше.

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

— Обсчет многомерных векторов/матриц, когда алгоритм предполагает разные выборки по размерностям, и это удобнее оформлять отдельными функциями.

— Формирование/преобразование изображений в [видео]памяти.

Но в подавляющем большинстве случаев наложения указателей не происходит, и осторожность явно лишняя.
compiler optimization aliasing pointer memory
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.