সিআই-তে প্রোগ্রামিং যখন জিসিসি ব্যবহার করে স্ট্রাক প্যাক করা অমূল্য বলে মনে করে __attribute__((__packed__))
[...]
যেহেতু আপনি উল্লেখ করেছেন __attribute__((__packed__))
, আমি ধরে নিলাম আপনার উদ্দেশ্য হ'ল একটি এর মধ্যে সমস্ত প্যাডিং অপসারণ করা struct
(প্রতিটি সদস্যকে 1 বাইট সারিবদ্ধকরণ করুন)।
সমস্ত সি সংকলকগুলিতে কাজ করে এমন স্ট্রিংগুলির প্যাকিংয়ের কোনও মান নেই?
... এবং উত্তর নেই". একটি স্ট্রাকের সাথে সম্পর্কিত প্যাডিং এবং ডেটা সারিবদ্ধকরণ (এবং স্ট্যাক বা হিপগুলিতে স্ট্রাক্টের সুসংগত অ্যারে) একটি গুরুত্বপূর্ণ কারণে বিদ্যমান। অনেকগুলি মেশিনে, স্বাক্ষরবিহীন মেমরি অ্যাক্সেসের ফলে সম্ভাব্য উল্লেখযোগ্য পারফরম্যান্স পেনাল্টি হতে পারে (যদিও কিছু নতুন হার্ডওয়্যারে এটি কম হয়ে থাকে)। কিছু বিরল ক্ষেত্রে পরিস্থিতিগুলিতে, ভুল স্বাক্ষরিত মেমরি অ্যাক্সেসের ফলে বাসের ত্রুটি পাওয়া যায় যা অপরিশোধনযোগ্য নয় (এমনকি পুরো অপারেটিং সিস্টেম ক্র্যাশও হতে পারে)।
যেহেতু সি স্ট্যান্ডার্ডটি বহনযোগ্যতার দিকে ফোকাস করছে, তাই কোনও কাঠামোর সমস্ত প্যাডিং অপসারণ এবং স্বেচ্ছাসেবী ক্ষেত্রগুলিকে ভুল পথে চালিত করার অনুমতি দেওয়ার কোনও স্ট্যান্ডার্ড উপায় থাকার কোনও ধারণা নেই, যেহেতু এটি করার ফলে সি কোডটি বহনযোগ্য নয় এমন ঝুঁকি তৈরি হবে।
কোনও বাহ্যিক উত্সে এই জাতীয় ডেটা আউটপুট দেওয়ার সবচেয়ে নিরাপদ এবং সর্বাধিক পোর্টেবল উপায় হ'ল আপনার কাঁচা মেমরির সামগ্রীগুলি প্রেরণের চেষ্টা করার পরিবর্তে বাইট স্ট্রিমগুলিতে / থেকে ক্রমিক করা structs
। এটি আপনার প্রোগ্রামটিকে এই সিরিয়ালাইজেশন প্রসঙ্গে বাইরে পারফরম্যান্সের জরিমানার হাত থেকে struct
বাঁচায় এবং পুরো সফ্টওয়্যারটি ছুঁড়ে ফেলে এবং গ্লাইচ না করে অবাধে নতুন ক্ষেত্র যুক্ত করতে দেয় । এটি কখনই উদ্বেগের বিষয় হয়ে দাঁড়ায় যদি শেষের দিক এবং এই জাতীয় জিনিসগুলি মোকাবেলার জন্য আপনাকে কিছু জায়গা দেয়।
সংকলক-নির্দিষ্ট নির্দেশাবলীর কাছে না পৌঁছে সমস্ত প্যাডিং অপসারণের একটি উপায় রয়েছে, যদিও ক্ষেত্রগুলির মধ্যে আপেক্ষিক ক্রমটি বিবেচনা না করে তবে এটি কেবলমাত্র প্রযোজ্য। এরকম কিছু দেওয়া হয়েছে:
struct Foo
{
double x; // assume 8-byte alignment
char y; // assume 1-byte alignment
// 7 bytes of padding for first field
};
... আমাদের এই ক্ষেত্রগুলি সমন্বিত কাঠামোর ঠিকানার সাথে সম্পর্কিত সারিবদ্ধ মেমরি অ্যাক্সেসের জন্য প্যাডিং প্রয়োজন:
0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
x_______y.......x_______y.......x_______y.......x_______y.......
... যেখানে .
প্যাডিং নির্দেশ করে। x
পারফরম্যান্সের জন্য প্রত্যেককে অবশ্যই 8-বাইট সীমানায় সারিবদ্ধ হতে হবে (এবং কখনও কখনও এমনকি সঠিক আচরণও)।
আপনি যেমন একটি SoA (অ্যারের কাঠামো) উপস্থাপনা ব্যবহার করে একটি পোর্টেবল উপায়ে প্যাডিং অপসারণ করতে পারেন (আসুন ধরে নেওয়া যাক আমাদের 8 টি Foo
দৃষ্টান্ত প্রয়োজন ):
struct Foos
{
double x[8];
char y[8];
};
আমরা কার্যকরভাবে কাঠামোটি ভেঙে ফেলেছি। এই ক্ষেত্রে, মেমরির উপস্থাপনাটি এমন হয়:
0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
x_______x_______x_______x_______x_______x_______x_______x_______
... এবং এই:
01234567
yyyyyyyy
... আর কোনও প্যাডিং ওভারহেড নয়, এবং ভুল মিসাইনযুক্ত মেমরি অ্যাক্সেসকে জড়িত না করে যেহেতু আমরা আর কোনও ডেটা ক্ষেত্রের কোনও কাঠামোর ঠিকানার অফসেট হিসাবে অ্যাক্সেস করব না, পরিবর্তে কার্যকরভাবে অ্যারের জন্য একটি বেস ঠিকানার অফসেট হিসাবে।
এটি উভয়ই কম ডাটা ব্যবহারের ফলে ক্রমানুসারে অ্যাক্সেসের জন্য দ্রুত হওয়ার বোনাস বহন করে (মেশিনের প্রাসঙ্গিক ডেটা ব্যবহারের হারকে কমিয়ে দিতে মিশ্রণে অপ্রাসঙ্গিক প্যাডিং আর নেই) এবং সংকলকটির জন্য খুব তুচ্ছভাবে প্রক্রিয়াকরণটিকে ভেক্টরাইজ করার সম্ভাবনাও রয়েছে ।
নেতিবাচক দিকটি হ'ল এটি কোড করার একটি পিআইটিএ। ক্ষেত্রের মধ্যে বৃহত্তর প্রবাহের সাথে এলোমেলো অ্যাক্সেসের জন্য এটি সম্ভাব্যভাবেও কম দক্ষ, যেখানে প্রায়শই AOS বা AoSoA প্রতিনিধি আরও ভাল করতে পারেন। তবে প্যাডিং নির্মূল করার এবং সমস্ত কিছুর প্রান্তিককরণের সাথে স্ক্রু না করে জিনিসগুলি যথাসম্ভব শক্ত করে প্যাক করার একটি স্ট্যান্ডার্ড উপায়।