2015-03-18 17 views

Odpowiedz

22

Z documentation for the ARM compiler (który bazuje na GCC):

__attribute__((pure)) atrybutów funkcja
wiele funkcji nie mają skutków wyjątkiem zwrócić wartość, a ich zwracana wartość zależy tylko od parametrów i zmiennych globalnych. Funkcje tego rodzaju mogą podlegać analizie przepływu danych i mogą zostać wyeliminowane.

__attribute__((const)) atrybut funkcji Wiele funkcji analizuje tylko przekazane do nich argumenty i nie ma żadnych efektów poza wartością zwracaną. Jest to klasa znacznie bardziej restrykcyjna niż __attribute__((pure)), ponieważ funkcja nie może odczytać pamięci globalnej. Jeśli znana jest funkcja działająca tylko na jej argumentach, może ona podlegać powszechnej eliminacji podekspresji i optymalizacji pętli.

Więc TL; DR: __attribute__((const)) jest taka sama jak __attribute__((pure)) ale bez dostępu do zmiennych globalnych.

+2

Należy zauważyć, że kompilator ARM zapewnia również kwalifikator funkcji _ __pure', który jest bardziej rygorystyczny niż atrybut 'pure' i jest równoważny atrybutowi' const'. – ysap

+7

Warto również zauważyć, że notatka o argumentach wskaźnika w dokumencie GCC: 'Zwróć uwagę, że funkcja, która ma argumenty wskaźnikowe i analizuje wskazane dane, nie może być zadeklarowana jako const'' – origo

2

Różnica jest wyjaśnione w GCC manuals

The __attribute__ ((pure)) oznacza, że ​​funkcja nie ma skutków ubocznych i wartość zwracana zależy od argumentów i stanu zmiennych globalnych. Dlatego optymalizator może bezpiecznie przesyłać niektóre wywołania, jeśli argumenty są takie same, a stan globaliów nie zmieniał się między wywołaniami.

__attribute__ ((const)) oznacza, że ​​wartość zwracana jest wyłącznie funkcją argumentów, a jeśli któryś z argumentów są wskaźnikami, wówczas wskaźniki nie musi być dereferencjonowane.

Funkcja jest zawsze pure.

Przykłady const funkcji byłoby funkcje matematyczne z <math.h>: sqrt, exp, itd. (Choć mogą one podlegać trybach zaokrągleń).

Przykłady pure ale const funkcji będzie takie funkcje jak strlen - jak to dereferences wskaźnik przekazywany w

Powiązane problemy