Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: [VC] Trong VC++, kích thước struct được tính như thế nào ?

  1. #1
    Ngày gia nhập
    08 2006
    Bài viết
    60

    Mặc định [VC] Trong VC++, kích thước struct được tính như thế nào ?

    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.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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

  3. #3
    Ngày gia nhập
    08 2006
    Bài viết
    60

    Cám ơn nhe ! Được rồi !

  4. #4
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    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:
    Code:
    class A
    {
    A(); virtual ~A(); virtual void Buzz(); void Bang(); int m_iTest;
    }
    sizeof(A) = ? why?

  5. #5
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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;

  6. #6
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Mặc định [VC] Trong VC++, kích thước struct được tính như thế nào ?

    Trích dẫn Nguyên bản được gửi bởi TQN
    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ờ:
    Code:
    class B: public A
    {
    
    virtual void Buzz();
    }
    sizeof(B) = ?

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

Các đề tài tương tự

  1. Bài tập C++ làm sao truy xuất biến của struct lồng trong struct
    Gửi bởi quangnam.tamky trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 10-04-2013, 05:22 PM
  2. Khai báo một struct trong 1 class như thế nào?
    Gửi bởi hoanglamth1 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 1
    Bài viết cuối: 22-11-2011, 10:42 AM
  3. Lập trình C xóa 1 trường trong struct như thế nào?
    Gửi bởi dongthang00 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 17-05-2011, 03:18 PM
  4. Lập trình C Gán giá trị cho kiểu struct trong C như thế nào?
    Gửi bởi nhiepphong200 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 01-12-2010, 06:04 PM
  5. Một số thắc mắc về struct trong C++
    Gửi bởi ilikegame trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 28-09-2008, 08:05 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn