Sıfır uzunluklu dizinin başka bir kullanımı, derleme zamanı yapı ofset kontrolüne yardımcı olmak için bir yapı içinde adlandırılmış bir etiket gibidir.
Hem başlangıçta hem de sınırı geçtiği yerde önbellek çizgisi sınırına hizalandıklarından emin olmak istediğiniz bazı büyük yapı tanımlarına (birden çok önbellek satırına yayılır) sahip olduğunuzu varsayalım.
struct example_large_s
{
u32 first; // align to CL
u32 data;
....
u64 *second; // align to second CL after the first one
....
};
Kodda bunları aşağıdaki gibi GCC uzantılarını kullanarak bildirebilirsiniz:
__attribute__((aligned(CACHE_LINE_BYTES)))
Ancak yine de bunun çalışma zamanında uygulandığından emin olmak istiyorsunuz.
ASSERT (offsetof (example_large_s, first) == 0);
ASSERT (offsetof (example_large_s, second) == CACHE_LINE_BYTES);
Bu, tek bir yapı için işe yarayacaktır, ancak birçok yapıyı kapsamak zor olacaktır, her birinin hizalanacak farklı üye adı vardır. Büyük olasılıkla, her yapının ilk üyesinin adlarını bulmanız gereken aşağıdaki gibi bir kod alırsınız:
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);
Bu şekilde gitmek yerine, yapı içinde, tutarlı bir ada sahip adlandırılmış bir etiket gibi davranan ancak herhangi bir alan tüketmeyen sıfır uzunlukta bir dizi bildirebilirsiniz.
#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
....
};
Daha sonra çalışma zamanı onaylama kodunun bakımı çok daha kolay olacaktır:
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);