Ngày nay, với sự ngạc nhiên lớn của tôi, tôi phát hiện ra rằngC/C++ nhận được kích thước struct
Khi các nhà điều hành sizeof được áp dụng cho một lớp, struct, hoặc loại công đoàn, kết quả là số byte trong một đối tượng thuộc loại đó, cộng với bất kỳ phần đệm nào được thêm vào để căn chỉnh các thành viên trên các ranh giới từ. Kết quả không nhất thiết phải tương ứng với kích thước được tính bằng cách thêm các yêu cầu lưu trữ của từng thành viên.
Tôi không biết về nó, và khá chắc chắn điều này là vi phạm một số mã cũ của tôi: để đọc tập tin nhị phân Tôi đã từng có cấu trúc như thế này một:
struct Header
{
union {
char identc[4];
uint32 ident;
};
uint16 version;
};
và đọc những 6 byte trực tiếp với fread
do sizeof
:
fread(&header, sizeof(header), 1, f);
Nhưng bây giờ sizeof(header)
lợi nhuận 8
!
Có thể rằng với các phiên bản GCC cũ sizeof(header)
trở 6
, hoặc tôi tâm trí của tôi là hoàn toàn biến mất?
Dù sao có bất kỳ toán tử nào khác (hoặc chỉ thị tiền xử lý hoặc bất kỳ thứ gì) cho phép trình biên dịch biết các cấu trúc lớn như thế nào - không bao gồm đệm?
Nếu không, cách nào sẽ là cách sạch để đọc cấu trúc dữ liệu thô từ tệp không yêu cầu viết quá nhiều mã?
EDIT: Tôi biết rằng đây không phải là cách đúng để đọc/ghi dữ liệu nhị phân: Tôi muốn có kết quả khác nhau tùy thuộc vào máy endianess và các công cụ. Dù sao phương pháp này là phương pháp nhanh nhất, tôi vẫn cố gắng đọc một số dữ liệu nhị phân để nhanh chóng lấy nội dung của nó, chứ không phải viết một ứng dụng tốt mà tôi sẽ sử dụng trong tương lai hoặc để phát hành.
có thể trùng lặp của [Tại sao không phải là sizeof cho một cấu trúc bằng tổng của sizeof của mỗi thành viên?] (Http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct -equal-to-the-sum-of-sizeof-of-each-member) – cdhowie
chỉ là một chú thích: standard-C cũng không cho phép các thành viên 'union' chưa được đặt tên; Ngoài ra, các loại tiêu chuẩn có kích thước cố định (được khai báo trong 'stdint.h') được gọi là' uint32_t' và 'uint16_t' – Christoph
Sẽ hữu ích khi trích dẫn báo giá của bạn đến từ đâu. Đây có phải là tiêu chuẩn gần đây không? – beldaz