ZawzietyRobaczek
ZawzietyRobaczek
#programista #jezykc #cpp #programowanie #programista15k czesc, w jaki sposób mogę zaalokować jeden duży blok pamięci, ale tak zeby wpakować tam rozne struktury, tzn. ma tam być blok np. 100 wartosci 1 bajtowych, a po tym np. 100 wartosci 4 bajtowych, a potem jakas bardziej złożóna struktura, np:
typedef struct
{
char files[256][256];
int a,b,c;
}

no i powiedzmy ze to zrobić poprzez malloc. Finalny rozmiar w bajtach znam, ale jak to zallokować jako unsigned char? jak potem dobrac wskazniki do poszczegolnych poczatków segmentów?
  • Najlepsze
  • Wszystkie komentarze
MamCieNaHita
@ZawzietyRobaczek: uważaj, bo pchasz się w type puning i wyrównanie pamięci
MamCieNaHita
@ZawzietyRobaczek: to zrób po prostu jedną wielką strukturę z memberami takich typów jak chcesz i pomiń castowanie z chara...
M.....f
M.....f
@ZawzietyRobaczek: StructName* ptr = (StructName*)malloc(sizeof(StructName);
Saly
Saly
0
@ZawzietyRobaczek: pytanie po co? Jak chcesz przesłać takie coś przez sieć to użyj czegoś innego np. protobufów. Jak chodzi o performance to poczytaj arena (region) allocatorach. Jeśli chcesz to robić sam to pakujesz się w problemy, nie warto
Saly
Saly
0
? jak potem dobrac wskazniki do poszczegolnych poczatków segmentów?


@ZawzietyRobaczek: std::vector arena (rozmiar);
StructName *structInArena = reinterpret_cast(arena.data() + offset);
To ile wynosi offset zależy od sizeof wszystkiego co jest przed
Krolik
Krolik
@ZawzietyRobaczek: poczytaj o placement new
ZawzietyRobaczek
ZawzietyRobaczek
@MamCieNaHita: @Malkof: @Saly: dzieki, nie nie musze tego robić, po prostu myslalem ze jesli mam np. strukturę mapy + textury + lightmapy itp to ze jest sens zeby to zrobic za jednym zamachem w duzym ciągłm bloku pamieci.. ale chyba waznejesze jest zeby np. mapa byla w jednym bloku poprzez malloc i tam samo textury poprzez osobny malloc itp, wiec to bez sensu jednak, dzieki
avr250
@ZawzietyRobaczek: Nie do końca bez sensu, bo z czasem przekonasz się, ze istnieje coś co się nazywa fragmentacją pamięci. Alokowanie od sasa do lasa sprawia, że sumarycznie jest sporo wolnego miejsca, ale nie możesz zablokować pamięci, bo nie ma wolnego tak dużego ciągłego bloku.
Saly
Saly
0
@ZawzietyRobaczek: generalnie popularne alokatory (jemalloc, mimalloc, tcmalloc czy nawet defaultowy ptmalloc na linuxie) działają tak, że starają się robić wszystko w taki sposób, żeby było jak najwydajniej. Standardową praktyką dla dużych ilości małych alokacji jest użycie jakiegoś bufora, który alokuje się tylko raz i potem kolejne wywołania malloc używają już uzytego miejsca

ale chyba waznejesze jest zeby np. mapa byla w jednym bloku poprzez malloc i tam samo textury poprzez
ZawzietyRobaczek
ZawzietyRobaczek
@Saly: ok to inaczej, najpierw myslalem, zeby zarowno mapa, textury a potem lightmapy byly "jedne po drugim" w ciaglym bloku bez fragmentacji, tj. cala struktura mapy (która bylaby wyrównana do 4 bajtów) od razu po niej textury (jeden pixel to 4bajty wiec tez by bylo wyrownane) a po nich lightmapy (jeden pixel to 1 bajt)
abdiel
@Saly: hahahaha ( ͡° ͜ʖ ͡°), super po przykładzie z kodu, od razu widać, że ma się doczynienia z człowiekiem kultury ( ͡° ͜ʖ ͡°)