Wpis z mikrobloga

#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?
  • 12
@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
? 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
@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
@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.
@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 osobny
@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)