Bonjour les devs,
Ce qui me fait aimer le C++ à d'autres langages c'est son côté bas niveau. En effet, on peut calculer l'espace en octet d'une variable avec sizeof(<var ou type>).
Comme je suis indécis quant au choix de ma structure de données, j'hésite entre un tableau pur ou une unordered_map. La rapidité d'accès n'est pas un soucis dans mon cas, ce qui me préoccupe le plus c'est l'espace mémoire.
J'ai tenté de comparer un tableau de N structures bidons avec une unordered_map qui a comme clef un entier et comme valeur une structure bidon.
En faisant sizeof(unordered_map), j'obtiens une valeur inférieur à sizeof(tableau_normal) ce qui me paraît bizarre mais surtout une valeur fixé sur 56 quelque soit la taille de la hashmap.
J'ai déniché un code qui apparemment calcule la mémoire utilisé par une unordered_map, mais je ne suis pas très convaincu :
Pour une taille de 1000 j'ai naturellement un tableau qui occupe 1000 octets (structure d'un char..), pour l'unordered map 1109.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #include <iostream> #include <unordered_map> using namespace std; struct S{ char a; }; #define SIZE 1000 int main() { S array[SIZE]; cout << "size array " << sizeof(array)<<endl; std::unordered_map<int, S> u; for(int i = 0; i< SIZE; ++i){ S s; u[i] = s; } cout << "1)size unordered map " << sizeof(u)<<endl; size_t count = 0; for (unsigned i = 0; i < u.bucket_count(); ++i) { size_t bucket_size = u.bucket_size(i); if (bucket_size == 0) { count++; } else { count += bucket_size; } } cout << "2)size unordered map " << count<<endl; return 0; }
Ma question :
Comment déterminer facilement et efficacement la taille mémoire de n'importe quelle variable de n'importe quel type?
Partager