__attribute __ ((const)) wystarczy
Jak udokumentowano w: https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Function-Attributes.html, to informuje kompilator, że dana funkcja nie modyfikuje globalnych (choć można je odczytać).
Istnieje również podzbiór pure
z const
, który również zabrania odczytów globalnych.
Rozważmy następujący uproszczony przykład:
int __attribute__((const)) g();
int f(int a) {
int x = a;
g();
return x - a;
}
Na g++
4,8 x86_64 -O3
, kompiluje do:
xor %eax,%eax
z const
- duży funkcja, która nie przypuszczam
a
nie jest modyfikowana bez const
Wygląda na to, że nie ma żadnego dokładniejszego atrybutu, który mówi, że funkcja nie modyfikuje zmiennej podanej, zgodnie z wymaganiami.
Czy __attribute __ ((const)) można zastosować do wskaźników funkcji?
spróbujmy:
int f(int& a, void __attribute__((const)) (*g)(void)) {
int x = a;
(*g)();
return x - a;
}
Ponownie kompiluje do xor %eax,%eax
oraz dużej funkcji bez const
, więc odpowiedź brzmi: tak.
składnia został poproszony na: Function pointer to __attribute__((const)) function?
pojawiła się również w 2011 roku na liście dyskusyjnej pod adresem: http://comments.gmane.org/gmane.comp.gcc.help/38052 W czasie przynajmniej to działało tylko dla niektórych atrybutów.
Czy __attribute __ ((const)) można dodać do typedef?
to działa:
typedef void __attribute__((const)) (*g_t)(void);
int f(int& a, g_t g) {
int x = a;
(*g)();
return x - a;
}
czyli
typedef void (g_t)(void);
int f(int& a, g_t __attribute__((const)) g) {
int x = a;
g();
return x - a;
}
Ale nie mogłem znaleźć drogę do zarówno umieścić atrybut na typedef i przekazać funkcję, nie wskaźnik , np .:
typedef void __attribute__((const)) (g_t)(void);
GCC ostrzega, że W tym przypadku atrybut został zignorowany.
Możesz wziąć parametr według wartości ('int a'), który zapewni kompilatorowi, że nic nie może go zmienić. Nie jestem pewien, co masz na myśli przez "unikalne odniesienie". – cdhowie
co dzieje się ze znakiem const int x = a? –
@pepper_chico 'a' nadal może być odniesieniem do czegoś, co potencjalnie zmienia się przez wywołanie' cb() ', więc odejmowanie wciąż nie może być zoptymalizowane. – Snps