Wpis z mikrobloga

Mam funkcję, która rozkłada jakiś tam string na wektor stringów:

std::vector mySplit(const std::string& str);
Czy bezpiecznie jest zadeklarować ją z atrybutem pure?

__attribute__((pure))
Z punktu widzenia teorii programowania moja funkcja jest czysta. Jednakże, vector przechowuje swoje elementy na stercie, więc maże po pamięci globalnej kiedy w ciele funkcji wkładam do niego stringi.
Podczas kompilacji nie ma żadnych ostrzeżeń, funkcja przechodzi testy jednostkowe, a jednak nie mam pewności czy czynię dobrze.
#jezykc #cpp #programowanie
  • 8
std


@CamelCase: Jedne z warunków, aby funkcja była pure:
* wartość zwracana musi być zależna od parametrów (pamięć globalna na którą wskazuje jeden z parametrów nie jest uznawana za parametr),
* nie może pisać po pamięci globalnej (może natomiast czytać z niej),
* funkcja nie może robić I/O,
* jeśli funkcja wywołuje inne funkcje - to one wszystkie muszą być pure,

Wg. tych warunków Twoja funkcja nie jest pure.
Nie znam
wartość zwracana musi być zależna od parametrów (pamięć globalna na którą wskazuje jeden z parametrów nie jest uznawana za parametr),


@8tab: nieprawda, ten warunek jest inny: wartość zwracana nie może być zależna od niczego innego oprócz parametrów (argumentów) lub/i zmiennych globalnych.
zgadza się. Zabrakło zmiennych globalnych w moim wpisie.


@8tab: nie dla tego, twój wpis jest błędny logicznie

A nie może byc zależne od B
to nie to samo co

A musi być zależne od nie B
Zgadzam się, że to nie są te same zdania, ale dokumentacja mówi o zależności (depends), a nie o niezależności (o której Ty piszesz). Cytat z dokumentacji gcc: "Many functions have no effects except the return value and their return value
depends only on the parameters and/or global variable"
@leoha:
@CamelCase: Wydaje mi się, że dodanie __attribute__((pure)) nie powoduje żadnych sprawdzeń. Jakby kompilator umiał sobie sam sprawdzić, że funkcja jest pure, to byś mu tego nie musiał podpowiadać. Po prostu kompilator zakłada, że to jest pure, a jak nie jest, to masz możesz dostać undefined behaviour, czyli nasal demons i inne atrakcje w pakiecie.

Nie mam pojęcia, jak dokładnie pure działa dla argumentów i wartości nie będących typami prostymi, więc nie