Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

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


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
10 odpowiedzi w tym temacie

#1 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 28.12.2012 21:58

*
Popularny

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 ;)

Zarządzanie ciągami znaków w pamięci pluginu | DarkGL Blog
  • +
  • -
  • 9

#2 glut

    Godlike

  • Przyjaciel

Reputacja: 954
Master

  • Postów:2 086
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Namysłów
Offline

Napisano 28.12.2012 22:22

Dzięki za info. Na pewno mi się to przyda.

Mam pytanie. Czy bardzo jest to odczuwalne jeżeli w 1 pluginie nie zastosuję #define lecz zmienną. Czy tylko działa przy większej ilości plugin'ów.
  • +
  • -
  • 0

Nie pomagam za darmo na PW/GG/Steam od tego jest forum

 

TP Game + RR

 

Znak rozpoznawczy :coto:


#3 Droso

    Dawniej HubertTM

  • Support Team

Reputacja: 1 291
Godlike

  • Postów:2 371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Wrocław
Offline

Napisano 28.12.2012 22:30

Dzięki za info. Na pewno mi się to przyda.

Mam pytanie. Czy bardzo jest to odczuwalne jeżeli w 1 pluginie nie zastosuję #define lecz zmienną. Czy tylko działa przy większej ilości plugin'ów.



Tego nie odczujesz w ogóle, tylko lepiej zawsze oszczędzić trochę pamięci na co innego :P

Ja zawsze jakoś to #define z tekstem nie byłem związany i dziwnie mi to wyglądało, więc zawsze robiłem tak jak to powinno wyglądać ;D
I to czasem tylko nie wpływa na samą kompilację, a nie na ogólne działanie pluginu?

Użytkownik HubertTM edytował ten post 28.12.2012 22:31

  • +
  • -
  • 1

Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!

Na zlecenie i bez zlecenia zresztą też!


#4 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 28.12.2012 22:40

Pytanie o ilość pluginów przy której ma to "sens" nie ma tu zbyt dużego sensu. na pewno warto tego używać zawsze.

HubertTM sekcja DAT jest wczytywana do pamięci maszyny wirtualnej więc de facto pamięci serwera jeżeli będzie ona zapelniona dużą ilościa takich niepotrzebnych danych może to w pewien sposób wpłynąć na szybkosc pracy serwera na pewno warto dbać o jak najlepszą jakoś naszych pluginów
  • +
  • -
  • 1

#5 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 29.12.2012 18:10

Niby już o tym słyszałem, ale nie wiedziałem dokładnie co się dokładnie dzieje jeśli damy define.

A jak to wygląda przy liczbach? Lepiej jest dawać
#define JAKAS_LICZBA 1

czy
new const JAKAS_LICZBA = 1

a może jeszcze inaczej?
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#6 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 29.12.2012 18:48

w obu przypadkach przy ich użyciu ( np. w parametrze funkcji ) na stos zostanie wrzucona wartość tylko w inny sposób
przy define bezpośrednio tzn.
PUSH.C value
przy zmiennej nie jawnie tzn.
przekazujemy adres a maszyna wirtualna pobierze wartość
PUSH address

  • +
  • -
  • 2

#7 d0naciak

    Godlike

  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 07.01.2013 19:13

czyli, jeżeli dobrze zrozumiałem w przypadku liczb, lepiej zastosować #define, gdyż wartość jest przekazywana bezpośrednio tak ?
  • +
  • -
  • 0

#8 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 07.01.2013 22:36

Operacja wyłuskania wartości z adresu jest tak mało obciążająca że nie ma to większego znaczenia

osobiście stosuje zmienne ze względu na większą kontrolę preprocesor nie jest inteligentnym narzędziem i to jest jego wada
nie możesz być do końca pewny jak wygląda kod który dostaje kompilator po jego działaniach :)
  • +
  • -
  • 0

#9 Filip1512

    Wszechmogący

  • Power User

Reputacja: 137
Zaawansowany

  • Postów:641
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:Poland
Offline

Napisano 10.01.2013 11:53

A jaka jest różnica między tym a stringiem?
  • +
  • -
  • 0
Filip / `NN
Wymuszanie rate'ów co spawna - update v2.1!

#10 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 10.01.2013 12:52

String to ciąg znaków, w pierwszym poście masz podane różnice ;)
  • +
  • -
  • 0

If you can dream it, you can do it.


#11 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 10.01.2013 15:57

A jaka jest różnica między tym a stringiem? // :huh: http://pl.wikipedia.org/wiki/Tekstowy_typ_danych

String można tłumaczyć jako "ciąg znaków" ale także "łańcuch", dlatego używa się również określenia "łańcuch znaków" lub krótko "łańcuch"


  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych