Đó là việc tìm bù đắp byte của một thành viên cụ thể là struct
. Ví dụ, nếu bạn có cấu trúc sau:
struct MyStruct
{
double d;
int i;
void *p;
};
Sau đó, bạn sẽ phải offsetOf(MyStruct, d) == 0
, offsetOf(MyStruct, i) == 8
, và offsetOf(MyStruct, p) == 12
(có nghĩa là, các thành viên mang tên d
lượng là 0 byte từ khi bắt đầu của cấu trúc, vv).
Cách hoạt động là giả vờ rằng một thể hiện cấu trúc của bạn tồn tại tại địa chỉ 0 (phần ((a*)(0))
), và sau đó nó lấy địa chỉ của thành viên cấu trúc dự định và đặt nó vào một số nguyên. Mặc dù dereferencing một đối tượng tại địa chỉ 0 thường sẽ là một lỗi, nó là ok để có địa chỉ vì địa chỉ của nhà điều hành &
và thành viên dereference ->
hủy bỏ lẫn nhau.
Nó thường được sử dụng cho các khung công tác tuần tự hóa tổng quát. Nếu bạn có mã để chuyển đổi giữa một số loại dữ liệu dây (ví dụ: byte trong một tệp hoặc từ mạng) và cấu trúc dữ liệu trong bộ nhớ, thường là thuận tiện để tạo ánh xạ từ tên thành viên đến thành viên bù đắp, để bạn có thể tuần tự hóa hoặc deserialize giá trị một cách chung chung.
Nguồn
2011-10-26 01:58:40
Đó 'offsetof' vĩ mô là không chính xác. Họ nên đúc thành 'size_t', không phải' int', và chúng có lẽ nên trừ '(char *) 0' khỏi kết quả trước khi truyền mặc dù nó là hằng số con trỏ null. –