2011-11-28 21 views
7

Oto kod pisałem (przy użyciu GCC __restrict__ rozszerzenie C++):W jaki sposób * limit/* __ restrict__ działa w 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; 
} 

Lub wersja C (w przypadku wersji C++ nie jest jasne, dzięki zastosowaniu przedłużenia których każdy popularny kompilator C++ obsługuje), przy użyciu 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; 
} 

z tego co czytałem, jeśli robię *a = 5, zmienia wartość pamięci on a jest wskazując; potem pamięć, do której wskazuje, nie powinna być modyfikowana przez nikogo poza wyjątkiem a, co oznacza, że ​​programy te są błędne, ponieważ zmieniają je po tym, b i c. Lub, nawet jeśli b modyfikuje najpierw i, po tym tylko a powinien mieć dostęp do tej pamięci (i). Czy otrzymuję poprawnie?

P.S: Ograniczenie w tym programie nic nie zmienia. Z ograniczeniem lub bez niego kompilator wygeneruje ten sam kod zespołu. Napisałem ten program tylko po to, aby wyjaśnić pewne rzeczy, nie jest to dobry przykład użycia numeru restrict. Dobrym przykładem restrict użycia można zobaczyć tutaj: http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html

+5

Nie ma "ograniczenia" w C++; cokolwiek innego jest rozszerzeniem kompilatora. –

+1

możliwy duplikat [Co mogą ludzie zrobić z ograniczającego kwalifikatora?] (Http://stackoverflow.com/questions/1506794/what-can-human-beings-make-out-tre-restrict-qualifier) –

+0

@KerrekSB Niż za ten program w C, używając "ograniczenia", zapytałem C/C++ ... Jeden z nich. –

Odpowiedz

11

nr

Oświadczenia

*b = 8; 
*c = 9; 

spowoduje niezdefiniowanej zachowanie.

Z dokumentacji:

Wskaźnik jest adresem lokalizacji w pamięci. Więcej niż jeden wskaźnik może uzyskać dostęp do tego samego fragmentu pamięci i modyfikować go podczas trwania programu. Kwalifikator typu restrict jest wskazaniem dla kompilatora, że ​​jeśli pamięć adresowana przez zmienny wskaźnik zostanie zmodyfikowana, żaden inny wskaźnik nie uzyska dostępu do tej samej pamięci. Kompilator może zoptymalizować kod obejmujący restrict - kwalifikowane wskaźniki w sposób, który w przeciwnym razie może spowodować nieprawidłowe zachowanie. Obowiązkiem programisty jest upewnienie się, że użyte zostały odpowiednie wskaźniki, ponieważ były one przeznaczone do użycia. W przeciwnym razie może dojść do niezdefiniowanego zachowania.

+0

Czy nie napisałem tego samego? Nie zapytałem, czy program jest poprawny, powiedziałem sobie, że jest źle z powodu b i c. Przez pomyłkę nie mam na myśli, że spowoduje błąd, nawet komunikat ostrzegawczy, ponieważ jest to "Umowa między programistą i kompilatorem", kompilator nie sprawdza tego. Rozumiem, że odpowiedź na moje pytanie ("Czy otrzymuję to poprawnie/dobrze?") Jest prostym "Nie"? –

+0

W przypadku, gdy pytanie nie jest jasne: nie zapytałem, czy program jest prawidłowy, miało być błędne. Pytam, czy wyjaśnienie mojego rozumienia "ograniczenia" pod kodem jest poprawne. –

+3

@MoraruLilian "Nie" jest w szczególności odpowiedzią na "Lub, nawet jeśli" b "najpierw modyfikuje" i ", potem tylko" a "powinno mieć dostęp do tej pamięci (" i "). Czy otrzymuję ją poprawnie?" Chodzi o to, że nie można nawet próbować uzyskać dostępu do tej zmiennej przez inny wskaźnik. – Beginner

Powiązane problemy