Я думаю, что вы неправильно интерпретируете noalias
;это не то же самое, что указание __restrict
для каждого параметра.В примере , на который вы ссылаетесь из MSDN , это означает, что a
, b
и c
не изменяют и не ссылаются на какое-либо глобальное состояние (текущей единицы компиляции), но они свободныпсевдоним друг друга.Вы можете также указать __restrict
для каждого, чтобы указать, что они не псевдонимы друг друга.Я не уверен, почему вы упоминаете об изменении всех вызовов функций в этом сценарии;до тех пор, пока вызывающий абонент не назовет аргументы, на сайте вызовов ничего не изменится.Вы должны просмотреть все вызовы, но они не должны изменяться, если вам не нужно удалить псевдонимы.В частности, __restrict
- это , а не , необходимый на месте вызова.
Единственным аналогом в GCC будет указание __restrict
(или чаще для GCC ,__restrict__
) в любых объявлениях переменных глобальных указателей в одном и том же исходном файле (которые имеют совместимые типы).См. здесь о указателях для файловой области restrict
.Конечно, нет никакой гарантии, что GCC будет вести себя иначе, поскольку restrict
часто рассматривается только в области действия функции.Microsoft четко представила noalias
, чтобы включить специфическую оптимизацию, которую они представили.
Короче говоря, здесь нет трюка с макросами (кроме упомянутого R, чтобы полностью игнорировать __declspec()
в GCC).Лучшее, что вы можете сделать, это добавить __restrict
к любому параметру указателя без псевдонима и объявлениям глобальных переменных.