शून्य लंबाई सरणी का एक अन्य उपयोग एक संकलित नाम के रूप में एक संरचना के अंदर एक संकलित समय संरचना ऑफसेट चेक की सहायता के लिए है।
मान लें कि आपके पास कुछ बड़ी संरचनात्मक परिभाषाएँ हैं (कई कैश लाइनें फैलाते हैं) जो आप यह सुनिश्चित करना चाहते हैं कि वे शुरुआत में और बीच में जहां यह सीमा पार करती हैं, दोनों जगह कैश लाइन की सीमा से जुड़ी होती हैं।
struct example_large_s
{
u32 first; // align to CL
u32 data;
....
u64 *second; // align to second CL after the first one
....
};
कोड में आप उन्हें GCC एक्सटेंशन का उपयोग करके घोषित कर सकते हैं जैसे:
__attribute__((aligned(CACHE_LINE_BYTES)))
लेकिन आप अभी भी यह सुनिश्चित करना चाहते हैं कि यह रनटाइम में लागू हो।
ASSERT (offsetof (example_large_s, first) == 0);
ASSERT (offsetof (example_large_s, second) == CACHE_LINE_BYTES);
यह एकल संरचना के लिए काम करेगा, लेकिन कई संरचनाओं को कवर करना कठिन होगा, प्रत्येक में अलग-अलग सदस्य का नाम होना चाहिए। आपको सबसे नीचे कोड प्राप्त करने की संभावना होगी जहां आपको प्रत्येक संरचना के पहले सदस्य के नाम खोजने होंगे:
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);
इस तरह से जाने के बजाय, आप संरचना में एक शून्य लंबाई सरणी को एक संगत नाम के साथ नामित लेबल के रूप में घोषित कर सकते हैं लेकिन किसी भी स्थान का उपभोग नहीं करते हैं।
#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
....
};
फिर रनटाइम एश्योरेंस कोड बनाए रखना बहुत आसान होगा:
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);