Dùng #pragma pack(1) đi để pack struct của cậu lại và tránh field padding, field align. Xem thêm trong MSDN về #pragma pack
Tui hiện viết chương trình đọc file WAV.
Tui tạo struct thể hiện cấu trúc header của file WAV. Bất ngờ, là nếu làm như vậy thì đọc sai liên tục. Trong khi đó, nếu tui SetFilePointer trực tiếp tới chỗ cần đọc thì đọc 0 sai.
Sau đó, tui dùng hàm sizeof để kiểm tra kích thước của struc thì khá bất ngờ.
Kích thước do sizeof trả về 0 phải lúc nào cũng bằng tổng kích thước của các trường. Kích thước struct thay đổi 0 hiểu nổi! Nhiều lúc, UNSHORT kích thước là 2 byte, nhưng có lúc là 4 byte. Có lúc thêm liên tục 4 biến char mà kích thước struct chả thay đổi. Nếu thêm 1 biến nữa là 5 biến char thì kích thước struct tăng chỉ có 4 byte
Việc này chỉ có nếu struct có nhiều trường(field), còn nếu struct chỉ có 1 biến thì 0 hề. Tui đã coi hướng dẫn hàm sizeof trên MSDN thì nó nói là VC padding zero thì phải.
Thông tin quá ít.Tui hiện vẫn nắm được vấn đề này.
Dùng #pragma pack(1) đi để pack struct của cậu lại và tránh field padding, field align. Xem thêm trong MSDN về #pragma pack
Cám ơn nhe ! Được rồi !
Ký này là do VC nó làm tròn các trường < 4 byte thành 4 byte (1 thanh ghi trong WIN) để truy cập nó nhanh hơn ấy mà.
Trong Pascal cũng có cái này, chỉ thị tiền biên dịch là {$A+}. Trong C em không biết.
Nhân đây đố các bác giả sử em có 1 khai báo như sau:
sizeof(A) = ? why?Code:class A {A(); virtual ~A(); virtual void Buzz(); void Bang(); int m_iTest;}
sizeof(class) = sizeof(all member variables) with align + sizeof pointer vptr (pointer to virtual table).
In this case, sizeof(A) = sizeof(m_iTest) (align 4) + sizeof(pointer) = 4 + 4 = 8;
OK bác. Thế bây giờ:Nguyên bản được gửi bởi TQN
sizeof(B) = ?Code:class B: public A {virtual void Buzz();}
Cái này còn tùy thuộc vào compiler nữa, vì mỗi compiler implement code cho define và definition của class/struct # nhau. Trong trường hợp VC++ 2005 trên máy tui, sizeof(B) = sizeof(A), vì B kế thừa từ A và không có một data member nào, với vptr của A # vptr của B.