Penggunaan lain dari array panjang nol adalah sebagai label bernama di dalam struct untuk membantu waktu kompilasi pemeriksaan offset struct.
Misalkan Anda memiliki beberapa definisi struct besar (mencakup beberapa baris cache) yang ingin Anda pastikan mereka sejajar dengan batas baris cache baik di awal dan di tengah di mana ia melintasi batas.
struct example_large_s
{
u32 first; // align to CL
u32 data;
....
u64 *second; // align to second CL after the first one
....
};
Dalam kode, Anda dapat mendeklarasikannya menggunakan ekstensi GCC seperti:
__attribute__((aligned(CACHE_LINE_BYTES)))
Namun Anda tetap ingin memastikan ini diterapkan dalam runtime.
ASSERT (offsetof (example_large_s, first) == 0);
ASSERT (offsetof (example_large_s, second) == CACHE_LINE_BYTES);
Ini akan berfungsi untuk satu struct, tetapi akan sulit untuk mencakup banyak struct, masing-masing memiliki nama anggota yang berbeda untuk disejajarkan. Anda kemungkinan besar akan mendapatkan kode seperti di bawah ini di mana Anda harus menemukan nama anggota pertama dari setiap struct:
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);
Alih-alih menggunakan cara ini, Anda dapat mendeklarasikan array dengan panjang nol di struct yang bertindak sebagai label bernama dengan nama yang konsisten tetapi tidak menggunakan spasi.
#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
....
};
Maka kode pernyataan waktu proses akan jauh lebih mudah dikelola:
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);