Zarządzanie ciągami znaków w pamięci pluginu

Często w pluginach widać taką konstrukcję

#define SOME_TEXT "text"

jednak jest to bardzo złe podejście ale można je łatwo naprawić 😉

Najpierw co się dzieje przy użyciu define preprocesor podczas przeszukiwania naszego kodu każde wystąpienie SOME_TEXT podmieni na „text”. Potem przychodzi etap kompilacji i teraz każde wystąpienie ciągu znaków nie przypisanego do żadnej zmiennej ( tak zwane hardcoded ) czyli w naszym przypadku „text” zostanie dodane do sekcji DAT ( tam trzymane są wszystkie zmienne globalne i właśnie ciągi znaków ) . Inaczej mówiąc jeśli użyjemy 20 razy SOME_TEXT to „text” zostanie dodane do sekcji DAT 20 razy. Kompilator w żaden sposób tego nie optymalizuje.

I tak jest z każdym ciągiem znaków który jest hardcoded. Tak jak mowiłem możemy to łatwo naprawić.
Jeśli zamiast define użyjemy

new const SOME_TEXT[] = "text";

i będziemy używać tej stałej zmiennej to wszystkie odwołania do niej będą polegały na odwołaniu się do tego samego adresu ( w pawn wszystkie tablice są przekazywane przez referencje )

Podsumowując ciąg znaków „text” wyląduje w sekcji DAT tylko raz i wszystkie odwołania do zmiennej SOME_TEXT będą działać na tym samym ciągu/miejscu w pamięci 😉

2 komentarzy o “Zarządzanie ciągami znaków w pamięci pluginu

  1. Jako iż kiedyś pisałem na gg i nie odpisałeś napiszę tutaj. Dlaczego gdy mam tą funkcję w pluginie: http://www.wklej.org/id/912856/ to gdy na serwer wbijam to się crashuje i pisze invalid entity i próbowałem różnych rzeczy ale nie mam pojęcia ( głowię się z tym już 2 dni ).

    Przydałby się jednak SB

  2. Na początku kodu sprawdzasz czy entity jest poprawne ( pev_valid ) jeśli tak to wychodzisz z funkcji jeśli nie funkcja działa dalej i wykonujesz operacje na entity chyba już wiesz gdzie jest błąd 😉

Dodaj komentarz