Dynamiczny rezerwacja pamięci dla zmiennej, w zależności od jej wielkości

0

Da się jakoś ''dynamicznie'' przydzielić pamięć przy definicji z inicjalizacją zmiennej/stałej, w zależności od jej wielkości? Np. int w C++ domyślnie rezerwuje 4 bajty, więc może przechować wartości z przedziału [ - (2^31); 2^31 - 1 ].

Natomiast co jeśli od razu przydzialam do inta bardzo niską wartość np. 3. const int a = 3
Bez sensu żeby korzystał w takim przypadku z aż 4 bajtów. Da się to jakoś łatwo ograniczyć do 1 bajta, albo nawet i lepiej: do 3 bitów?

1

Tak, możesz użyć innego typu, np. int8_t z <cstdint>. Jeśli masz kilka takich zmiennych możesz pomyśleć o polach bitowych (bitfields) w strukturze.

Przy czym mam wrażenie że próbujesz podejmować się optymalizacji na ślepo - pierw popraw algorytm, a dopiero potem benchmarkuj implementację aby zobaczyć czy takie zabawy mają sens.

0

Nie mam zamiaru tego używać w praktyce, jedynie ciekawość.

Nie chcę korzystać z innego typu zmiennych z mniejszym zakresem. Chciałbym ograniczyć zakres i pamięć gotowego już inta - da się tak? Jeśli nie, da się prosto samemu stworzyć typ danych w którym określam jak dużo mają zajmować pamięci, a więc jak duży mają mieć zakres?

Jak to kompilator przemiela w praktyce? Zgaduje, że wygląda to mniej więcej tak:
((deklaracja)) -> definicja (od razu rezerwuje 4 bajty) -> inicjalizacja - jeśli jest tak faktycznie w rzeczywistości, to wobec tego czy da się najpierw zarezerwować te 4 bajty. a potem uciąć niepotrzebny nadmiar? Lub też czy może da się jakoś "na równi" z perspektywy kompilatora w tym samym czasie zainicjalizować i zdefiniować typ zmiennej?

Dzięki za wzmiankę o polach bitowych, nie słyszałem o tym jeszcze, poczytam.

5

Minimalną jednostką alokacji jest bajt - czyli najczęściej 8 bitów. Przy czym tak naprawdę alokowane i tak jest 4, 8 czy 16 bajtów, bo tak działają alokatory (a jeszcze głębiej, to alokator pierw musi mieć dostępną stronę pamięci, więc możliwe, że alokując bajt pod spodem poprosisz o 4kB od systemu).

Ucięcie nadmiaru teoretycznie jest możliwe przy użyciu realloc, ale dla takich wielkości w praktyce nie. Ponadto wszystkie typy danych mają jeszcze swój alignment, o czym też powinieneś poczytać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1