2012-10-11 29 views
5

En el programa que estoy codificación, una de mis declaraciones de funciones dice así:¿Debo usar __restrict en las referencias?

bool parse(const sentence & __restrict sentence) 
{ 
    // whatever 
} 

Cuando puedo compilar el código con Microsoft Visual Studio 2010 Express, el compilador se queja: C4227

advertencia: anacronismo utilizado: calificadores de referencia se ignoran

Sin embargo, this page de la documentación de GCC dice:

Además de permitir punteros restringidos, puede especificar referencias restringidas, que indican que la referencia no tiene alias en el contexto local.

Y la misma página da un ejemplo muy explícito:

void fn (int *__restrict__ rptr, int &__restrict__ rref) 
{ 
    /* ... */ 
} 

¿He entienden mal la advertencia de MVSC? ¿o debería transformar todas mis referencias en punteros para que se aplique __restrict?

+1

¿Cuál es el punto de comparar MSVC y GCC aquí? '__restrict' es una ** extensión de proveedor **, por lo que debe cumplir las reglas de cada proveedor. –

Respuesta

8

C++ no tiene la noción de restrict en la forma en que lo hace C99.

Sin embargo, varios proveedores de compiladores ofrecen extensiones a sus compiladores C++, que llaman __restrict (¡tenga en cuenta el nombre reservado!). Dado que esos son extensiones, su comportamiento está determinado por el ­ pi ­ proveedor de ler. Deberá leer la documentación y averiguar qué hace esta extensión en cada com ­ pi ­ ler por separado.

El hecho de que dos proveedores hayan elegido el mismo nombre no significa que las extensiones tengan algo en común.

+0

¿Puedes dar un ejemplo de dónde dos extensiones tienen el mismo nombre pero diferente significado para diferentes compiladores? – rsp1984

+0

@RafaelSpring: Claro. En el compilador DS9K, cada nombre que comience con guiones bajos dobles tiene un significado diferente durante cada ejecución de compilación :-) –

0

Presumiblemente, ya que comienza con ____restrict es una extensión específica de la implementación que puede comportarse como lo desee cada implementación. Me imagino que ambos compiladores son correctos en este caso.

En lugar de cambiar sus referencias a punteros, ¿por qué no evitar restrict en su totalidad, utilizando un generador de perfiles para encontrar sus puntos calientes y solo si muestra que ese alias no cubierto por las reglas de alias estrictos de C++ está tomando un tiempo de CPU significativo ¿Consideraría cambiar una referencia específica a un puntero?