Cómo puerto __declspec(noalias) en GCC
-
10-12-2019 - |
Pregunta
Si entiendo correctamente, __declspec(noalias)
le dice al compilador que ninguno de los punteros pasados como parámetros es un alias.
__declspec(noalias) void multiply(float * a, float * b, float * c)
{
...
}
Dicho de otra manera, si no me equivoco , es exactamente equivalente a la llamada __restrict
en cada parámetro de tipo puntero.Pero hay una manera de hacerlo sin cambiar todas las llamadas a la función?Lo ideal sería sustituir __declspec(noalias)
con una definición de preprocesador.
Solución
Creo que eres la interpretación de noalias
incorrectamente;no es la misma como la especificación de los __restrict
en cada parámetro.En el ejemplo de referencia de MSDN, significa que a
, b
, y c
no modifique o hacer referencia a cualquier estado global (de la actual unidad de compilación), pero son libres de alias el uno al otro.Usted podría también especificar __restrict
en cada uno de ellos para indicar que no se alias el uno al otro.No estoy seguro de por qué usted menciona el cambio de todas las llamadas de función en esta situación;mientras las llamadas sin alias de los argumentos, nada cambia en el sitio de llamada.Usted debe revisión todas las llamadas, pero ellos no tienen que cambiar a menos que usted necesita para eliminar el aliasing.Específicamente, __restrict
es no se necesita en el sitio de llamada.
El único análogo en GCC sería especificar __restrict
(o más comúnmente para GCC, __restrict__
) en cualquier puntero global declaraciones de variables en el mismo archivo de origen (que son de tipos compatibles).Ver aquí sobre archivo-alcance restrict
-calificados punteros.Por supuesto, no hay ninguna garantía de que GCC se comportará de manera diferente, ya que restrict
se considera a menudo en el ámbito de la función.Microsoft introdujo claramente noalias
para permitir una optimización específica que introdujo.
Larga historia corta, no hay macro truco aquí (aparte de la mencionada, por R a ignorar __declspec()
completamente de GCC).Lo mejor que puedes hacer es agregar __restrict
para cualquier no-alias parámetro de puntero y global de las declaraciones de variables.
Otros consejos
Sólo #define __declspec(x)
(para una definición en blanco).La omisión de noalias/restringir no voy a hacer ningún cambio a la comportamiento de un programa correcto.Todo lo que hace es crear más (generalmente de muy menor, con la actual tecnología del compilador) oportunidades para el compilador para optimizar.