Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

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: 6033
Godlike

  • Postów:10832
  • 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
  • +
  • -
  • 8

#2 glut

    Godlike

  • Przyjaciel

Reputacja: 931
Master

  • Postów:2073
  • 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: 1279
Godlike

  • Postów:2371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Tomaszów Mazowiecki
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: 6033
Godlike

  • Postów:10832
  • 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

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • 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
Generator tabeli expa - aż do 103600 poziomu

#6 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6033
Godlike

  • Postów:10832
  • 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

  • +
  • -
  • 1

#7 donaciak

    Godlike

  • Power User

Reputacja: 892
Czempion

  • Postów:2067
  • 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: 6033
Godlike

  • Postów:10832
  • 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: 136
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: 1570
Godlike

  • Postów:2733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Online

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: 6033
Godlike

  • Postów:10832
  • 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