কম্পিউটার টিউটোরিয়াল

সি/সি++-তে স্ট্রাকচারের sizeof কেন মেম্বারদের sizeof-এর যোগফলের সমান নয়?


একটি স্ট্রাকচার টাইপ এলিমেন্টের আকার sizeof() দ্বারা নেওয়া হলে সেটি সব সময় প্রতিটি মেম্বারের আকারের যোগফলের সমান হয় না। কম্পাইলার কখনো কখনো অ্যালাইনমেন্ট সমস্যা এড়াতে কিছু প্যাডিং (padding) যোগ করে। তাই আকারটি বদলায়। প্যাডিং যোগ হয় যখন একটি স্ট্রাকচার মেম্বারের পর একটি বড় আকারের মেম্বার আসে বা স্ট্রাকচারের শেষে। ভিন্ন কম্পাইলারের ভিন্ন অ্যালাইনমেন্ট কনস্ট্রেইন্ট থাকে। সি স্ট্যান্ডার্ডে, মোট অ্যালাইনমেন্ট স্ট্রাকচার ইমপ্লিমেন্টেশনের ওপর নির্ভরশীল।

কেস ১ (Case 1)

এই কেসে double z ৮-বাইট লম্বা, যা x (৪-বাইট) চেয়ে বড়। তাই আরও ৪-বাইট প্যাডিং যোগ হয়।また short টাইপ ডেটা y-র মেমরিতে ২-বাইট স্পেস আছে তাই এক্সট্রা ৬-বাইট প্যাডিং হিসেবে যোগ হয়।

সি/সি++-তে স্ট্রাকচারের sizeof কেন মেম্বারদের sizeof-এর যোগফলের সমান নয়?

উদাহরণ কোড

#include <stdio.h>
struct myStruct {
    int x;        // ইন্টিজার ৪ বাইট, এবং প্যাডিং ৪ বাইট
    double z;     // ডাবল আকার ৮-বাইট, কোনো প্যাডিং নেই
    short int y;  // শর্ট আকার ২-বাইট, প্যাডিং ৬-বাইট
};
main() {
    printf("Size of struct: %d", sizeof(struct myStruct));
}

আউটপুট ২

Size of struct: 24

কেস ২ (Case 2)

এই কেসে double প্রথমে ইনসার্ট করা হয়েছে, এবং এটি ৮-বাইট স্পেস নেয়। এখন ইন্টিজার x (৪-বাইট) যোগ হয়। তাই আরেক ৪-বাইট স্পেস থাকে। যখন short y যোগ হয়, তবে সেটি সেই এক্সট্রা ৪-বাইট স্পেসে ফিট হয়ে যায় এবং মোট ১৬-বাইট স্পেস নেয়।

সি/সি++-তে স্ট্রাকচারের sizeof কেন মেম্বারদের sizeof-এর যোগফলের সমান নয়?

উদাহরণ কোড

#include <stdio.h>
struct myStruct {
    double z;     // ডাবল আকার ৮-বাইট, কোনো প্যাডিং নেই
    int x;        // ইন্টিজার ৪ বাইট, এবং প্যাডিং ৪ বাইট
    short int y;  // শর্ট আকার ২-বাইট, প্যাডিং ৬-বাইট
};
main() {
    printf("Size of struct: %d", sizeof(struct myStruct));
}

আউটপুট ২

Size of struct: 16

কেস ৩ (Case 3)

তৃতীয় কেসেও এটি ১৬-বাইট মেমরি স্পেস নেয়, কিন্তু আয়োজন ভিন্ন। প্রথম মেম্বার যেহেতু double তাই সেটি প্রথমে রাখা হয়, তারপর short টাইপ ডেটা যোগ হয়। এখন যখন ইন্টিজার ইনসার্ট হতে চায়, তবে সেটি অবশিষ্ট ৬-বাইট এলাকায় ফিট হয়ে যায়। তাই শর্টের পর একটা প্যাডিং আছে কিন্তু ইন্টিজার ডেটার পর কোনো প্যাডিং দরকার নেই।

সি/সি++-তে স্ট্রাকচারের sizeof কেন মেম্বারদের sizeof-এর যোগফলের সমান নয়?

উদাহরণ কোড

#include <stdio.h>
struct myStruct {
    double z;     // ডাবল আকার ৮-বাইট, কোনো প্যাডিং নেই
    short int y;  // শর্ট আকার ২-বাইট, প্যাডিং ৬-বাইট
    int x;        // ইন্টিজার ৪ বাইট, এবং প্যাডিং ৪ বাইট
};
main() {
    printf("Size of struct: %d", sizeof(struct myStruct));
}

আউটপুট ২

Size of struct: 16
  1. সি/সি++ প্রোগ্রামে ট্রায়্যাঙ্গুলার ম্যাচস্টিক নম্বর বের করা

  2. C/C++ প্রোগ্রাম: প্যারাবোলার ভার্টেক্স, ফোকাস এবং ডিরেকট্রিক্স বের করা

  3. লিনাক্সে C++-এর জন্য সেরা IDE কী? (আলাদা লেখা)

  4. উইন্ডোজে C++-এর জন্য সেরা IDE কী? (আলাদা লেখা)