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 :
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;
}
En mettant __attribute__((__packed__)), j'ai bien 5 bytes comme taille pour ma structure Test au lieu de 8 (à cause du padding de structure).

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