সি ++ তে শ্রেণীর আকার কেন ডেটা সদস্যদের পাবলিক / বেসরকারী স্থিতির উপর নির্ভর করে?


23

আমি যা জানি, সেখান থেকে সি ++ এ শ্রেণীর আকার নীচের কারণগুলির উপর নির্ভর করে -

  1. সমস্ত অ স্থিতিশীল ডেটা সদস্যের আকার।
  2. ডেটা সদস্যদের অর্ডার।
  3. যদি বাইট প্যাডিং সক্ষম থাকে বা না হয়।
  4. এর তাত্ক্ষণিক বেস শ্রেণীর আকার।
  5. ভার্চুয়াল ফাংশনগুলির অস্তিত্ব।
  6. উত্তরাধিকারের পদ্ধতি (ভার্চুয়াল উত্তরাধিকার)।

এখন আমি নীচের মতো 2 টি ক্লাস তৈরি করেছি -

class A{
    int a;
    short s;
    int b;
    char d;
};// kept a char at last on purpose to leave a "hole"

class B : public A{
    char c;  
};

এখন এ এবং বিআই এর আকার পরীক্ষা করে দেখুন

  • A এর আকার: 16
  • বি আকার: 16

আমার ধারনা বি ক্লাসের চর সিটি ক্লাস এ-তে বাম "গর্তে" থাকার ব্যবস্থা করা হয়েছে is

তবে, আমাকে যা বিভ্রান্ত করেছে তা হ'ল নীচের দৃশ্যে আমি সদস্যদের পাবলিক করি

class A{
    public:
    int a;
    short d;
    int b;
    char s;
};

class B : public A{
    public:
    char c;
};

এখন আকার হয়ে যায়

  • A এর আকার: 16
  • বি আকার: 20

আমি এই পার্থক্যের কারণ বুঝতে পারি না।


1
সি ++ তে শ্রেণীর আকার কেন ডেটা সদস্যদের পাবলিক / বেসরকারী স্থিতির উপর নির্ভর করে? - না। সেগুলি সংকলক নির্ভর বাস্তবায়ন বিশদ।
PaulMcKenzie

1
সুতরাং আপনি কি সংকলক ব্যবহার করছেন?
রোমেন

2
@ পলম্যাককেনজি আসলে এটি করে। একই অ্যাক্সেস সহ স্ট্যান্ডার্ড ম্যান্ডেট সদস্যদের একত্রিত করে এতগুলি পরিবর্তন করা হয় যা সংকলকের প্যাডিং কৌশল পরিবর্তন করবে।
নাথান অলিভার

@ নাথান অলিভার-রিইনস্টেটমোনিকা, আমি এটি জানতাম না। আপনার কি কোনও সুযোগেই প্রাসঙ্গিক বিভাগে কোন রেফারেন্স রয়েছে?
আর সাহু

@ আরসাহু আমার উত্তরটি এখনই শক্ত করে রাখার জন্য এটি খুঁজছেন।
নাথান অলিভার

উত্তর:


8

Itanium ABI ক্লাসগুলি সংজ্ঞায়িত করতে লেডের C ++ 03 সংজ্ঞা ব্যবহার করে যা "লেআউটের উদ্দেশ্যে পিওডি" হয়। ব্যক্তিগত ডেটা সদস্য থাকা একটি শ্রেণিকে একটি সামগ্রিক হতে অযোগ্য ঘোষণা করে এবং তাই C ++ 03 তে POD:

একটি পিওডি-স্ট্রাক্ট একটি সামগ্রিক শ্রেণি যা নন-পিওডি-স্ট্রাক্ট, নন-পড-ইউনিয়ন (বা এই জাতীয় ধরণের অ্যারে) বা রেফারেন্সের কোনও স্থিতিশীল ডেটা সদস্য নেই এবং এর কোনও ব্যবহারকারী-সংজ্ঞায়িত অনুলিপি অ্যাসাইনমেন্ট অপারেটর এবং নেই ব্যবহারকারী-সংজ্ঞায়িত ডেস্ট্রাক্টর।

পিওডি ক্লাস হওয়ার কারণে লেজ প্যাডিং পুনঃব্যবহার অক্ষম করে :

এই ধরণের dsize, nvsize এবং nvalign তাদের সাধারণ আকার এবং প্রান্তিককরণ হিসাবে সংজ্ঞায়িত করা হয়। এই বৈশিষ্ট্যগুলি কেবল খালি-খালি শ্রেণির ধরণের জন্য যা বেস ক্লাস হিসাবে ব্যবহৃত হয় matter আমরা পিওডিদের জন্য লেজ প্যাডিং উপেক্ষা করি কারণ স্ট্যান্ডার্ডের প্রাথমিক সংস্করণটি এটিকে অন্য কোনও কিছুর জন্য আমাদের ব্যবহার করতে দেয়নি এবং কারণ এটি কখনও কখনও এই ধরণের দ্রুত অনুলিপি করার অনুমতি দেয়।

সুতরাং, আপনার প্রথম উদাহরণে, Aবিন্যাসের উদ্দেশ্যে কোনও পিওডি নয় এবং এর লেজ প্যাডিং ব্যবহার করা যেতে পারে B::cতবে আপনার দ্বিতীয় উদাহরণে এটি একটি পিওডি, এবং এর লেজ প্যাডিং পুনরায় ব্যবহার করা যাবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.