Jestem przyzwyczajony do używania __attribute__((nonnull))
podczas wyrażania wskaźników, które nie powinny mieć wartości null.Kiedy używam "__attribute __ ((nonnull))" vs "not_null <T*>"?
void f(int* ptr __attribute__((nonnull)));
int main(){
int* ptr = new int(1);
f(ptr);
}
void f(int* ptr){/*impl*/}
Jednak z GSL, jest także typem not_null<T*>
owinięcie.
void function1 (gsl :: not_null n);
void f(gsl::not_null<int*> n);
int main(){
int* ptr = new int(1);
f(ptr);
}
void f(gsl::not_null<int*> n){/*impl*/}
Zakładając obiekty językowe są tam, aby wspierać wersję GSL, należy zawsze używać not_null<T*>
zamiast __attribute__((nonnull))
teraz?
Odniosłem wrażenie, że atrybut kompilatora może pomóc w optymalizacji, ale wersja opakowania rozwiązuje problem z nieprzypisanym wskaźnikiem.
Jedno pytanie, Czy '__attribute __ ((nonnull)) 'przenośny w większych kompilatorach? – WhiZTiM
Dlaczego nie używać referencji lub 'span'? – Jarod42