Chociaż odpowiedź Jeffa jest prawidłowa, tzn. Zawsze można utworzyć wskaźnik do przydzielonej tablicy, faktem jest, że kompilator zna podczas kompilacji, że wartości tmp nie będą aliasowane, ponieważ zmienna jest zadeklarowana jako faktyczna tablica, a nie wskaźnik. Jedyną szansą na alias tablicy jest deklaracja do niej, więc jeśli tego nie zrobisz, nie musisz deklarować jej jako restrict
. Jest to bardziej oczywiste, jeśli tmpvalues
jest jedyną zmienną, jaką będziesz mieć w funkcji.
Problem może pojawić się, jeśli przechodzą wskaźnik do innej funkcji, to nie należy stwierdzić, czy odebrany wskaźnik jest ograniczony lub nie.
Dokumentacja natknąłem związanych z tym tematem obejmuje C99:
Niech D będzie deklaracja zwykłego identyfikatora, który zapewnia środki wyznaczenia obiektu P jako wskaźnik ograniczenia zakwalifikowanych do typu T
Należy pamiętać, że dotyczy to tylko wskaźników.
z TI zapewnia pewne wskazówki dotyczące dostrajania wydajności za pomocą słowa kluczowego restrict
. Oprócz wszystkich wskazówek, rozdział 3.3 podaje przykłady, kiedy można zastosować kwalifikator tego typu, a kiedy nie. Poszukaj deklaracji tablicy x
na środku strony 16, która stwierdza, że nie deklaruje wskaźnika, a zatem nie może być zastrzeżona.
Jakiego rodzaju ostrzeżenie to rzuca? – dhein
"nieprawidłowe użycie ograniczeń" - powinno być używane ze wskaźnikami, a nie tablicami (o ile rozumiem). Mogę zrobić float * ograniczyć tmpvalues = malloc (sizeof (float) * 1000), ale nie przydzielam na stos, który może mieć wpływ na wydajność. Poza tym mówienie kompilatorowi, że dostęp do indeksów tablic jest bezpieczny (więc nie potrzeba żadnych odczytów defensywnych) wydaje się bardzo naturalnym rozszerzeniem ograniczenia użycia przy pomocy wskaźników, więc intuicyjnie musi być sposób na zrobienie tego. –
Zrobiłem: float * restrict tmpvalues = alloca (sizeof (float) * 1000); memset (tmpvalues, 0, sizeof (float) * 1000); i to jest mierzalna poprawa ale wolałbym robić to w standardzie (jak w drodze reklamacji C99) –