• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Set, mapa, unordered mapa, ile pamięci zużywa

VPS Starter Arubacloud
+1 głos
324 wizyt
pytanie zadane 1 lutego 2023 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
Jak mozna liczyć ile pamięci zużywa mapa, unordered mapa, set? Vector i tablica to wiadomo.

1 odpowiedź

0 głosów
odpowiedź 1 lutego 2023 przez Wiciorny Ekspert (273,850 p.)
wybrane 1 lutego 2023 przez pasjonat_algorytmiki
 
Najlepsza

W Cpp nawet nie wiesz ile pamięci zajmuje tablica... o ile nie jest na sztywno zdefiniowana. 

W C++, nie ma jednoznacznej odpowiedzi na to, ile pamięci zużywa dana struktura danych, ponieważ zależy to od implementacji. Ogólnie jednak można powiedzieć, że mapy, unordered_mapy i zbiory zużywają więcej pamięci niż wektory i tablice, ponieważ zawierają dodatkowe informacje, takie jak klucze map i zbiorów lub hasze unordered_map. W przypadku wektorów i tablic pamięć jest zarezerwowana tylko dla elementów.

Tak do sprawdzenia Możesz użyć operatora sizeof, aby określić, ile pamięci zajmuje konkretny obiekt danej struktury danych. Na przykład:

 

#include <map>
#include <unordered_map>
#include <set>
#include <vector>
#include <iostream>

int main() {
    std::map<int, int> m;
    std::unordered_map<int, int> um;
    std::set<int> s;
    std::vector<int> v;
    int arr[100];

    std::cout << "Size of map: " << sizeof(m) << std::endl;
    std::cout << "Size of unordered_map: " << sizeof(um) << std::endl;
    std::cout << "Size of set: " << sizeof(s) << std::endl;
    std::cout << "Size of vector: " << sizeof(v) << std::endl;
    std::cout << "Size of array: " << sizeof(arr) << std::endl;

    return 0;
}

Wynik będzie zależał od implementacji i konfiguracji systemu, ale powinien pokazać różnicę w zużyciu pamięci między różnymi typami danych.

1
komentarz 1 lutego 2023 przez adrian17 Ekspert (346,900 p.)

Czepialstwo:

W Cpp nawet nie wiesz ile pamięci zajmuje tablica... o ile nie jest na sztywno zdefiniowana. 

W C++, nie ma jednoznacznej odpowiedzi na to, ile pamięci zużywa dana struktura danych, ponieważ zależy to od implementacji.

Wiesz i jest jednoznaczna. To że zależy od implementacji akurat ma małe znaczenie na cele pytania, bo pytanie jest o praktyczne zużycie pamięci.

Tak do sprawdzenia Możesz użyć operatora sizeof, aby określić, ile pamięci zajmuje konkretny obiekt danej struktury danych.

Co jak co, ale sizeof nic ciekawego nie mówi o zajęciu pamięci w tym przypadku. To jak porównywać rozmiar budynków po rozmiarach wizytówek.

W każdym razie przy vectorze faktycznie się da (capacity()), przy unordered_map możesz najwyżej próbować estymować używając bucket_count(), (max)_load_factor() etc. W alternatywnych implementacjach jak absl::flat_hash_map nawet ładnie dokumentują jak estymować zużycie.

W praktyce jak ktoś bardzo potrzebuje coś takiego bardzo dokładnie mierzyć, to podpina aplikację pod profiler pamięci :)

komentarz 1 lutego 2023 przez Wiciorny Ekspert (273,850 p.)
edycja 1 lutego 2023 przez Wiciorny
Ale odnoszę się do sytuacji, nie deklaracji,  dynamicznej tablicy w której rozmiar nie jest sztywny i stały, a ilość elementów zmienna.
Akurat uwagi dobre, nie neguje, dziękuje
komentarz 2 lutego 2023 przez j23 Mędrzec (195,220 p.)

Jeszcze można by spróbować z własną implementacją std::allocator, która liczyłaby ilość przydzielanej pamięci.

Podobne pytania

0 głosów
1 odpowiedź 314 wizyt
0 głosów
1 odpowiedź 107 wizyt
pytanie zadane 14 października 2022 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 18 marca 2021 w C i C++ przez Adamek185wp Obywatel (1,280 p.)

92,768 zapytań

141,691 odpowiedzi

320,508 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...