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.
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
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
@P ¿cómo puedo hacer eso? mira el montaje directamente y ve la diferencia? Restringir está en c99, pensé que __restrict era C++? – Anycorn