Wpis z mikrobloga

@VanQator: nie da się. nigdy w życiu nie spotkałem się też z żadnym w miarę trudnym, ale jak tak o tym myślę, to może da się jakimś cudem dostać do danych alokatora, zaintrygowałeś mnie.

ale nie, ogólnie nie tak ma to działać, jak chcesz znać rozmiar to go przechowaj w zmiennej
  • Odpowiedz
@e7th04sh: No jak piszę swoje algorytmiki to jak przekazuję wskaźnik na dynamiczną tablicę do funkcji, to zawsze obok przesyłam też rozmiar. Zawsze myślałem, że robię jakiś błąd i musi istnieć jakaś metoda na odczytanie takiego rozmiaru.
  • Odpowiedz
@VanQator: @e7th04sh: to i ja się podłączą.
To skąd program wykonując delete [] array; wie do którego miejsca zwolnić pamięć? Czy może pod spodem (kod procesora) dzieje się coś bardziej skomplikowanego?
  • Odpowiedz
@VanQator ściślej mówiąc przekazujesz wskaźnik na pierwszy element tej tablicy. Tablica to po prostu zaalokowane obok siebie zmienne, więc bez rozmiaru nie będziesz wiedział czy tam gdzie przesunąłeś wskaźnik są jeszcze elementy twojej tablicy czy już jakieś inne dane.
Oczywiscie bezpieczniej zawsze jest używać std::vector który pilnuje za ciebie żebyś nie wyszedł poza zakres tablicy.
  • Odpowiedz
@kamilspl: przyznaję się że nie wiem. Patrzysz w złym kierunku, kod procesora to tak jakbyś zamienił zdanie na słowa albo słowa na litery - nie może co innego dziać się w literach niż w zdaniach. Chodzi o coś innego - ktoś wykonuje część zadań za nas (zdania których nie widzisz, które zastępujesz jednym słowem u siebie new), czyli zajmuje się alokacją pamięci co jest nietrywialnym zadaniem. Nie znam się na
  • Odpowiedz
via Wykop Mobilny (Android)
  • 1
@VanQator: nie, używasz pary wskaźnik rozmiar, lub std vector jak człowiek

@kamilspl: alokator trzyma tą informację. Podawanie rozmiaru w czasie dealokacji było by szybsze, bo wtedy alokator nie musiałby przeglądac swoich struktur, ale tak zostało to zrobione
  • Odpowiedz
@kamilspl: bo ma tę informację zapisaną, ale to jest robione "systemowo", albo przez bibliotekę, natomiast sposób na przechowywanie tej informacji nie jest ustalany w standardzie.Dodatkowo, pamiętaj, że alokator możesz zmienić, więc jedno delete nie będzie toąsame z innym delete, bo tę informację co i jak zwolnić pobierze z innego miejsca.
  • Odpowiedz
Alokator mógłby działać bez przechowywania tej informacji i być może odnieść przez to nawet jakieś korzyści. Wyobraźmy sobie alokator działający na takiej zasadzie:
1. alokator alokuje strony po 1000 bajtów, np. pod adresem 4000, 5000, 6000
2. gdy program prosi alokator o tablicę wielkości n bajtów, alokator wybiera jedną ze stron które ma, w której tyle się zmieści
3. dla każdej strony alokator pamięta gdzie zaczyna się jej część której jeszcze nie oddał programowi, więc po new przesuwa tylko wskaźnik dalej
4. oraz pamięta ile jest jeszcze nie zwróconych tablic wewnątrz strony
5. przy delete alokator tylko zmniejsza licznik nie zwróconych tablic odpowiedniej strony
  • Odpowiedz
Wiesz, że jest więcej systemów i więcej abi?

@Kaczus2B: i właśnie z tego powodu że jest wiele abi standard c++ nie określa jak to działa po spodem. Chociaż jest zdaje się propozycja do standardu aby używać wszędzie tego samego abi.
  • Odpowiedz
@robko: wiele rzeczy było proponowanych, ale moim zdaniem nie jest to najrozsądniejsze, szczególnie, że c++ poza gamedevem używa się na systemach specjalistycznych, a tam juz jest róznie z róznych względów. Więc byłoby to podcinanie gałęzi na której się siedzi.
  • Odpowiedz
@VanQator: Jak już koledzy powiedzieli nie masz dostępu do tej informacji, chociaż jest ona przechowywana a globalnym alokatorze new/delete. Inna kwestią że używanie new/delete w modern cpp jest złą praktyką, wiec zastanów sie najpierw na co Ci to.
  • Odpowiedz