2010-05-01 11 views
11

¿Hay alguna manera de definir el uso de typedef integral/float type, que no implica aliasng?C/C++ __restrict type

algo equivalente a (pero constructo primitivo):

template < typename T > 
struct restrict { T* __restrict data; }; 

cuestión relacionada, es posible pedir gcc lo que determina alias/no alias del puntero es?

+0

Supongo que compila si hago 'typedef const double * __restrict type;' pero ¿crea restricción double * o algún tipo de restricción aplicada a 'type'? – Anycorn

+0

Prueba y mira. 'restrict' no está definido por el estándar de C++ así que ymmv. Si recuerdo mi propia experiencia correctamente, restringir participa en typedefs en GCC. – Potatoswatter

+0

@P ¿cómo puedo hacer eso? mira el montaje directamente y ve la diferencia? Restringir está en c99, pensé que __restrict era C++? – Anycorn

Respuesta

19

Como se señala en los comentarios, muchos compiladores C++ más nuevos admiten la implementación C99 del calificador de tipo restrictivo. Como restrict no es una palabra clave reservada en C++, los compiladores generalmente usan __restrict o __restrict__. Tanto GCC como Visual C++ documentan esto muy bien, con referencias explícitas a C99.

Los C++ 1998 norma establece que "El especificador typedef no se ... pueden combinar en una decl-especificador-ss con cualquier tipo de especificador excepto una tipo especificador." Básicamente, debe ser una lista de tipo-especificadores, que incluye los dos cv-calificadores, const y volatile.

C99 define typedef de manera similar, excepto que su lista de calificadores incluye restrict.

Parecería razonable anticipar un soporte similar en typedefs para el __restrict no estándar ... ¡pero nunca se sabe!

Una forma inteligente y fácil de probar esto es la siguiente:

extern void link_fail(); 

typedef int *__restrict restricted_int_p; 

void test(restricted_int_p a, restricted_int_p b) { 
    *a = 1; 
    *b = 2; 

    if (*a == 2) link_fail(); 
} 

Esto simplemente explota el hecho de que si el link_fail símbolo sin resolver se encuentra en el archivo de objeto, el enlazador generará un error. Si el compilador restringe correctamente los dos argumentos, debe conocer el valor de a, incluso después de que se modifique b. Por lo tanto, debe eliminar todo el bloque if del archivo de objeto generado, ya que nunca se ejecutará.

Tenga en cuenta que aunque GCC admitió la sintaxis restringida desde al menos la versión 3.0, realmente no realizó las optimizaciones adecuadas hasta version 4.5.

+0

"C99 define typedef de manera similar, excepto que su lista de calificadores incluye restrict." Hice [una pregunta sobre esto] (http://stackoverflow.com/q/43631062/2542702) y todos (que han comentado hasta ahora) piensan que es una mala idea. ¿Puedes comentar? ¿Es legal C escribir typedef puntero con restrict? –