শূন্য দৈর্ঘ্যের অ্যারের অন্য ব্যবহারটি স্ট্রাক্টের ভিতরে নামযুক্ত লেবেল হিসাবে টাইম স্ট্রাক অফসেট চেক করতে সহায়তা করার জন্য।
ধরুন আপনার কয়েকটি বৃহত স্ট্রাক্ট সংজ্ঞা রয়েছে (একাধিক ক্যাশে লাইন ছড়িয়ে আছে) যা আপনি নিশ্চিত করতে চান যে তারা শুরুতে এবং মাঝখানে যেখানে সীমানাটি অতিক্রম করে সেখানে লাইন সীমানার সাথে সংযুক্ত রয়েছে।
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
....
};
তারপরে রানটাইম দৃser় কোডটি বজায় রাখা আরও সহজ হবে:
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);