Tôi đã thực hiện đoạn mã sau làm ví dụ.Tại sao uint64_t cần nhiều bộ nhớ hơn 2 uint32_t khi được sử dụng trong lớp? Và làm thế nào để ngăn chặn điều này?
#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;
}
in
20
24
8
4
Vì vậy, nó là khá đơn giản để thấy rằng một uint64_t là lớn như hai uint32_t của, Tại sao lớp 2 sẽ có 4 byte thêm, nếu họ đều giống nhau ngoại trừ việc thay thế hai uint32_t cho một uint64_t.
Căn chỉnh. 'class2' cần phải được liên kết 8 byte. 'class1' không. –
Điều này về cơ bản chỉ xảy ra vì cách bạn xây dựng các lớp học của bạn. Vì 'uint64_t' phải căn chỉnh trình biên dịch cần phải ném vào 4 byte đệm trong' lớp2' (sau biến 'e') – UnholySheep
Bạn cũng có thể sắp xếp lại cấu trúc để có các trường theo thứ tự kích thước giảm dần, sau đó là phần đệm các vấn đề sẽ không xuất hiện vì các trường lớn hơn đã có trên một liên kết byte đẹp và sẽ chuyển các trường đó đến các trường có kích thước nhỏ hơn. –