2011-11-28 23 views
7

Aquí hay un código que escribí (usando __restrict__ extensión de GCC para C++):¿Cómo funciona * restrict/* __ restrict__ funciona en C/C++?

#include <iostream> 

using namespace std; 

int main(void) { 
    int i = 7; 
    int *__restrict__ a = &i; 
    *a = 5; 
    int *b = &i, *c = &i; 
    *b = 8; 
    *c = 9; 

    cout << **&a << endl; // *a - which prints 9 in this case 

    return 0; 
} 

O, la versión C (en caso de que la versión C++ no es clara debido a la utilización de una extensión que cada C populares ++ compilador apoya), usando GCC:

#include <stdio.h> 

int main(void) { 
    int i = 7; 
    int *restrict a = &i; 
    *a = 5; 
    int *b = &i, *c = &i; 
    *b = 8; 
    *c = 9; 

    printf("%d \n", **&a); // *a - which prints 9 in this case 

    return 0; 
} 

Por lo que he leído, si lo hago *a = 5, cambia el valor de la memoria que, a, está apuntando a; después de eso, la memoria a la que está apuntando no debería ser modificada por nadie más excepto a, lo que significa que estos programas están equivocados porque b y c lo modifican después de eso. O, incluso si b modifica i primero, después de eso solo a debería tener acceso a esa memoria (i). ¿Lo estoy obteniendo correctamente?

P.S: Restringir en este programa no cambia nada. Con o sin restricción, el compilador producirá el mismo código de ensamblaje. Escribí este programa solo para aclarar las cosas, no es un buen ejemplo del uso de restrict. Un buen ejemplo de restrict uso se puede ver aquí: http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html

+5

No hay 'restricción' en C++; cualquier otra cosa es una extensión de compilación. –

+1

posible duplicado de [¿Qué pueden hacer los seres humanos con el calificador restringido?] (Http://stackoverflow.com/questions/1506794/what-can-human-beings-make-out-of-the-restrict-qualifier) –

+0

@KerrekSB Considere este programa en C, usando "restringir", le pregunté a C/C++ ... Uno de ellos. –

Respuesta

11

declaraciones

*b = 8; 
*c = 9; 

causará un comportamiento indefinido.

De la documentación:

Un puntero es la dirección de un lugar en la memoria. Más de un puntero puede acceder al mismo fragmento de memoria y modificarlo durante el transcurso de un programa. El calificador de tipo restrict es una indicación para el compilador de que, si la memoria a la que se dirige el restrict-puntero calificado se modifica, ningún otro puntero accederá a esa misma memoria. El compilador puede optar por optimizar el código que implica restrict-punteros calificados de una manera que de lo contrario podría dar lugar a un comportamiento incorrecto. Es responsabilidad del programador asegurarse de que los restrict -calificadores calificados se usan como estaban destinados a ser utilizados. De lo contrario, puede generar un comportamiento indefinido.

+0

¿No escribí lo mismo? No pregunté si el programa es correcto, me dije a mí mismo que está mal debido a byc. Por error no quiero decir que dará un error, ni siquiera un mensaje de advertencia porque es un "Contrato entre el programador y el compilador", el compilador no lo verifica. Entonces, entiendo que la respuesta a mi pregunta ("¿Lo estoy obteniendo correctamente/correcto?") Es un simple "No". –

+0

En caso de que la pregunta no sea clara: no pregunté si el programa es correcto, se intentó que fuera incorrecto. Pregunto si la explicación de mi comprensión de "restringir" bajo el código es correcta. –

+3

@MoraruLilian "Respuesta especial" es en particular respuesta a "O, incluso si" b "modifica primero" yo ", después de eso solo" a "debería tener acceso a esa memoria (" i "). ¿Lo estoy obteniendo correctamente?" El punto es que ni siquiera se le permite intentar acceder a esta variable con otro puntero. – Beginner