Bonjour,
Je cherche à réduire la mémoire de mon application qui alloue très souvent une structure (disons Test dans notre exemple) en heap.
Voilà un mini-code qui montre le soucis :
En mettant __attribute__((__packed__)), j'ai bien 5 bytes comme taille pour ma structure Test au lieu de 8 (à cause du padding de structure).
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 #include <windows.h> #include <psapi.h> #include <iostream> static size_t getMemoryConsuption() { PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)); return pmc.WorkingSetSize; } struct Test { uint32_t* pointer; // 4 bytes unsigned char data; // 1 byte }__attribute__((__packed__)); int main() { std::cout << sizeof(Test) << std::endl; for (unsigned int i=0; i<10000000; i++) { Test* n = new Test(); n->data = 0; } std::cout << "getMemoryConsuption = " << getMemoryConsuption()/(1024*1024) << " MB" << std::endl; system("pause"); return 0; }
Mais c'est bizarre, en RAM quand je vérifie avec l'API windows et la fonction getMemoryConsuption(), j'ai 157 MB alloué pour 10 000 000 pointeurs sur Test.
Si j'enlève __attribute__((__packed__)), ma structure Test a donc une taille de 8 bytes mais j'ai quand même 157 MB alloué en RAM.
Pire encore, si j'enlève le membre data de la structure, la structure devient alignée sans avoir besoin de __attribute__((__packed__)) et a donc une taille de 4 octets. Et bien, j'ai aussi 157 MB de RAM alloué dans ce cas...
Je compile en 32 bits sous Windows 10 avec GCC 4.9.2 (TDM-1)
Qu'est ce qui se passe ?
Merci d'avance![]()
Partager