2011-11-28 9 views
7

Ecco il codice che ho scritto (utilizzando __restrict__ estensione del GCC di C++):Come * limitt/* __ restrict__ funziona in 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; 
} 

Oppure, la versione C (nel caso in cui la versione C++ non è chiaro a causa dell'uso di una proroga, che ogni popolare compilatore C++ sostiene), utilizzando 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; 
} 

da quello che ho letto, se lo faccio *a = 5, cambia il valore della memoria che, a, sta puntando; dopo di che, la memoria a cui sta puntando non dovrebbe essere modificata da nessun altro eccetto a, il che significa che questi programmi sono errati perché b e c lo modificano dopo. Oppure, anche se b modifica prima i, dopo che solo a dovrebbe avere accesso a quella memoria (i). Sto ottenendo correttamente?

P.S: La restrizione in questo programma non cambia nulla. Con o senza restrizioni, il compilatore produrrà lo stesso codice assembly. Ho scritto questo programma solo per chiarire le cose, non è un buon esempio di utilizzo di restrict. Un buon esempio di utilizzo restrict potete vedere qui: http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html

+5

Non c'è 'restrict' in C++; qualsiasi altra cosa è un'estensione del compilatore. –

+1

possibile duplicato di [Cosa possono fare gli esseri umani dal qualificatore restrittivo?] (Http://stackoverflow.com/questions/1506794/what-can-human-beings-make-out-of-the-restrict-qualifier) –

+0

@KerrekSB Considerare questo programma in C, usando "restrict", ho chiesto a C/C++ ... Uno di questi. –

risposta

11

No.

Dichiarazioni

*b = 8; 
*c = 9; 

causerà un comportamento indefinito.

Da documentazione:

Un puntatore è l'indirizzo di una locazione di memoria. Più di un puntatore può accedere alla stessa porzione di memoria e modificarla durante il corso di un programma. Il qualificatore di tipo restrict è un'indicazione al compilatore che, se la memoria indirizzata dal puntatore qualificato restrict viene modificata, nessun altro puntatore accederà alla stessa memoria. Il compilatore può scegliere di ottimizzare il codice che interessa restrict - puntatori qualificati in un modo che potrebbe altrimenti comportare un comportamento errato. È responsabilità del programmatore assicurarsi che i puntatori qualificati restrict vengano utilizzati nel modo previsto. In caso contrario, potrebbe verificarsi un comportamento non definito.

+0

Non ho scritto la stessa cosa? Non ho chiesto se il programma è corretto, mi sono detto che è sbagliato a causa di b e c. Per errore non intendo che darà un errore, nemmeno un messaggio di avviso perché è un "Contratto tra programmatore e compilatore", il compilatore non lo controlla. Quindi, capisco che la risposta alla mia domanda ("Sto ricevendo correttamente/giusto?") È un semplice "No"? –

+0

Nel caso in cui la domanda non sia chiara: non ho chiesto se il programma è corretto, era destinato a essere sbagliato. Chiedo se la spiegazione della mia comprensione di "limitare" sotto il codice è corretta. –

+3

@MoraruLilian "No" è in particolare la risposta a "O, anche se" b "modifica" i "prima, dopo che solo" a "dovrebbe avere accesso a quella memoria (" i "). Sto ricevendo correttamente?" Il punto è che non ti è nemmeno permesso di provare ad accedere a questa variabile con un altro puntatore. – Beginner

Problemi correlati