Ho fatto il seguente codice come esempio.Perché un uint64_t ha bisogno di più memoria di 2 uint32_t quando utilizzato in una classe? E come prevenirlo?
#include <iostream>
struct class1
{
uint8_t a;
uint8_t b;
uint16_t c;
uint32_t d;
uint32_t e;
uint32_t f;
uint32_t g;
};
struct class2
{
uint8_t a;
uint8_t b;
uint16_t c;
uint32_t d;
uint32_t e;
uint64_t f;
};
int main(){
std::cout << sizeof(class1) << std::endl;
std::cout << sizeof(class2) << std::endl;
std::cout << sizeof(uint64_t) << std::endl;
std::cout << sizeof(uint32_t) << std::endl;
}
stampe
20
24
8
4
Quindi è abbastanza semplice per vedere che uno uint64_t è grande come due uint32_t di, perché di classe 2, avrà 4 byte in più, se sono la stessa tranne che per la sostituzione di due uint32_t per un uint64_t.
Allineamento. 'class2' deve essere allineato a 8 byte. 'class1' no. –
Fondamentalmente succede solo per come costruisci le tue lezioni. Poiché 'uint64_t' deve essere allineato, il compilatore deve gettare 4 byte di padding in' class2' (dopo la variabile 'e') – UnholySheep
Puoi anche riorganizzare le strutture per avere i campi in ordine decrescente di dimensioni, quindi il padding i problemi non appariranno poiché i campi più grandi sono già su un allineamento di byte carino, e lo trasferiranno nei campi di minore dimensione. –