• 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

Cloud VPS
+1 głos
632 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 (281,530 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 Mentor (354,120 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 (281,530 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,240 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ź 606 wizyt
0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 14 października 2022 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
0 głosów
1 odpowiedź 242 wizyt
pytanie zadane 18 marca 2021 w C i C++ przez Adamek185wp Obywatel (1,280 p.)

93,466 zapytań

142,460 odpowiedzi

322,733 komentarzy

62,846 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

Kursy INF.02 i INF.03
...