Một cách sử dụng khác của mảng độ dài bằng không là như một nhãn được đặt tên bên trong một cấu trúc để hỗ trợ kiểm tra độ lệch cấu trúc thời gian biên dịch.
Giả sử bạn có một số định nghĩa cấu trúc lớn (kéo dài nhiều dòng trong bộ nhớ cache) mà bạn muốn đảm bảo rằng chúng được căn chỉnh với ranh giới dòng bộ nhớ cache cả ở phần đầu và phần giữa nơi nó vượt qua ranh giới.
struct example_large_s
{
u32 first; // align to CL
u32 data;
....
u64 *second; // align to second CL after the first one
....
};
Trong mã, bạn có thể khai báo chúng bằng các phần mở rộng GCC như:
__attribute__((aligned(CACHE_LINE_BYTES)))
Nhưng bạn vẫn muốn đảm bảo điều này được thực thi trong thời gian chạy.
ASSERT (offsetof (example_large_s, first) == 0);
ASSERT (offsetof (example_large_s, second) == CACHE_LINE_BYTES);
Điều này sẽ hoạt động cho một cấu trúc duy nhất, nhưng sẽ khó bao hàm nhiều cấu trúc, mỗi cấu trúc có tên thành viên khác nhau để căn chỉnh. Rất có thể bạn sẽ nhận được mã như bên dưới, nơi bạn phải tìm tên của thành viên đầu tiên của mỗi cấu trúc:
assert (offsetof (one_struct, <name_of_first_member>) == 0);
assert (offsetof (one_struct, <name_of_second_member>) == CACHE_LINE_BYTES);
assert (offsetof (another_struct, <name_of_first_member>) == 0);
assert (offsetof (another_struct, <name_of_second_member>) == CACHE_LINE_BYTES);
Thay vì đi theo cách này, bạn có thể khai báo một mảng có độ dài bằng 0 trong cấu trúc hoạt động như một nhãn được đặt tên với tên nhất quán nhưng không sử dụng bất kỳ khoảng trống nào.
#define CACHE_LINE_ALIGN_MARK(mark) u8 mark[0] __attribute__((aligned(CACHE_LINE_BYTES)))
struct example_large_s
{
CACHE_LINE_ALIGN_MARK (cacheline0);
u32 first; // align to CL
u32 data;
....
CACHE_LINE_ALIGN_MARK (cacheline1);
u64 *second; // align to second CL after the first one
....
};
Sau đó, mã xác nhận thời gian chạy sẽ dễ duy trì hơn nhiều:
assert (offsetof (one_struct, cacheline0) == 0);
assert (offsetof (one_struct, cacheline1) == CACHE_LINE_BYTES);
assert (offsetof (another_struct, cacheline0) == 0);
assert (offsetof (another_struct, cacheline1) == CACHE_LINE_BYTES);