সি ++: খালি শ্রেণীর কোন বস্তুর আকার কত?


111

আমি ভাবছিলাম যে খালি শ্রেণির কোনও জিনিসের আকার কী হতে পারে । এটি অবশ্যই 0 বাইট হতে পারে না যেহেতু এটি অন্য কোনও অবজেক্টের মতো উল্লেখ করা এবং এটি নির্দেশ করা সম্ভব হওয়া উচিত। কিন্তু, এত বড় একটি বিষয়?

আমি এই ছোট প্রোগ্রামটি ব্যবহার করেছি:

#include <iostream>
using namespace std;

class Empty {};

int main()
{
    Empty e;
    cerr << sizeof(e) << endl;
    return 0;
}

আমি ভিজ্যুয়াল সি ++ এবং সাইগউইন-জি ++ সংকলক উভয়কেই আউটপুটটি পেয়েছিলাম 1 বাইট ! এটি আমার কাছে একটু অবাক হওয়ার কারণ আমি এটি মেশিন শব্দের আকার (32 বিট বা 4 বাইট) আকারের আশা করছিলাম।

1 বাইটের আকার কেন কেউ ব্যাখ্যা করতে পারেন ? 4 বাইট না কেন ? এটি কি সংকলক বা মেশিনের উপরও নির্ভর করে? এছাড়াও, কেউ কি খালি শ্রেণীর অবজেক্টটি 0 বাইটের আকারের হবে না এর জন্য আরও বেশি যুক্তিযুক্ত কারণ দিতে পারে?


আমি শূন্য হতে না পারার কোনও কারণ দেখছি না। তবে এটি একটি আকার দেওয়ার মাধ্যমে সংকলকটিতে অন্যান্য জিনিসগুলি সহজ easier আপনার যদি এই জিনিসগুলির একটি অ্যারে থাকে তবে প্রতিটি উপাদানটির একটি অনন্য ঠিকানা প্রয়োজন। 1 এর আকার এটি সহজ করে তোলে।
মার্টিন ইয়র্ক

2
এটি শূন্য আকারের হতে পারে যদি এটি একটি বেস শ্রেণীর সাবওবজেক্ট হয়।
জোহানেস স্কাউব -

উত্তর:


129

বার্জন স্ট্রোস্ট্রপের সি ++ স্টাইল এবং টেকনিক কৌশল এফকিউ এর উদ্ধৃতি দিয়ে , আকারটি শূন্য নয় বলে হ'ল "দুটি পৃথক বস্তুর ঠিকানা আলাদা হবে কিনা তা নিশ্চিত করার জন্য।" এবং আকারটি 1 হতে পারে কারণ এখানে প্রান্তিককরণ কোনও বিষয় নয় কারণ এখানে দেখার মতো কিছুই নেই।


55
বাহ, হিক সে সি ++ সম্পর্কে কি জানবে? :-)
paxdiablo

18
@Lazer, কারণ সেখানে সি কোন খালি structs মধ্যে হয়
AIB

7
@nurabha এই পয়েন্টার পয়েন্ট থেকে অবজেক্ট। এটি বস্তুতে সংরক্ষণ করা হয়নি। তবে, যদি ভার্চুয়াল ফাংশন থাকে তবে অবজেক্টটিতে ভিটিবেলের একটি পয়েন্টার রয়েছে ter
টিবলার

4
@ কৃষিশ_জা: আপনারা ভুল ভেবেছেন। আপনি যখন স্ট্যাকের উপর কোনও ভেরিয়েবল বরাদ্দ করেন, এটি শূন্য বাইটগুলি দখল করতে পারে না (কারণ বিভিন্ন ভেরিয়েবলের বিভিন্ন ঠিকানার প্রয়োজন হয়), তাই আকারটি সর্বনিম্ন 1। এরপরে, এটি সংকলক পর্যন্ত। একইভাবে new; যখন স্থান বরাদ্দ করা হয়, অন্য বরাদ্দের আলাদা ঠিকানা থাকতে হবে। ইত্যাদি। খালি শ্রেণিতে জড়িত কোনও পয়েন্টার অগত্যা নেই; ভেরিয়েবলগুলিতে পয়েন্টার (বা রেফারেন্স, বা স্থানীয় / স্ট্যাক বরাদ্দ) থাকতে পারে, তবে সেগুলি শূন্য আকার নয় এবং এগুলি পয়েন্টার আকারের নয়।
জোনাথন লেফলার

3
@ পরিচালক, চালক নন তবে আমি জানি যে একটি হাসি কী :-) আপনি সেই আলোতে মন্তব্যটি আবার পড়তে চাইতে পারেন এবং বুঝতে পারেন এটি হাস্যকর।
প্যাক্সিডিয়াবলো

30

স্ট্যান্ডার্ডটি জানিয়েছে যে সমস্ত সর্বাধিক উত্পন্ন জিনিসগুলির আকার ()> = 1 থাকে:

এটি কোনও বিট-ফিল্ড (শ্রেণি.বিট) না থাকলে সর্বাধিক উত্পন্ন বস্তুর একটি শূন্য-আকারের আকার থাকবে এবং এক বা একাধিক বাইট স্টোরেজ দখল করবে। বেস শ্রেণীর সাব-অবজেক্টগুলির শূন্য আকার থাকতে পারে। আইএসও / আইসিসি এফডিআইএস 14882: 1998 (ই) অন্তঃসত্ত্বা


1
আমি দেখলাম এটাতে বিশ্বাস করা কঠিন. মান নিশ্চিত বাস্তবায়নের অপ্টিমাইজেশান যে ভালো implementer হাতে tying জিনিস মান সাধারনত নেই (আমি ভুল হতে পারে) ধরনের মত শব্দ করে না একটি ভাল কাজ করার জন্য একটি বিনামূল্যে হাত আছে তা নিশ্চিত করুন তার পথ থেকে সরে যায়
মার্টিন ইয়র্ক

4
@eSKay - এটির জন্য প্রয়োজনীয় যাতে বিভিন্ন বস্তুর বিভিন্ন ঠিকানা পায়। বস্তুর প্রতি আপনার পয়েন্টারের মানচিত্র থাকতে পারে না, উদাহরণস্বরূপ, যদি বিভিন্ন দৃষ্টান্তে একই ঠিকানা থাকে।
ব্রায়ান নিল

14

এটি বাস্তবায়নের বিশদ একবার অনেক আগে, আমি ভেবেছিলাম এটি শূন্য বাইট বা হাজার বাইট হতে পারে, এটির ভাষার স্পেসিফিকেশনের কোনও প্রভাব নেই। তবে, স্ট্যান্ডার্ডটি দেখার পরে (বিভাগ 5.3.3) sizeofসর্বদা এক বা ততোধিক প্রত্যাবর্তন হিসাবে সংজ্ঞায়িত করা হয়েছে, তা যাই হোক না কেন।

সর্বাধিক উত্সযুক্ত শ্রেণীর আকার শূন্যের চেয়ে বেশি হবে।

অন্যান্য জিনিসের মধ্যে এটির জন্য প্রয়োজনীয় যা আপনাকে অবজেক্টগুলির অ্যারে এবং পয়েন্টারগুলিকে পরিচালনা করতে দেয়। যদি আপনার উপাদানগুলি শূন্য আকারের হতে দেওয়া হয় তবে &(array[0])তার অনুরূপ &(array[42]), যা আপনার প্রসেসিং লুপগুলিতে সমস্ত ধরণের বিপর্যয় সৃষ্টি করে।

এটি কোনও মেশিন শব্দ না হওয়ার কারণ হ'ল এটির মধ্যে এমন কোনও উপাদান নেই যা প্রকৃতপক্ষে এটি একটি শব্দের সীমানায় (যেমন একটি পূর্ণসংখ্যার) প্রান্তিককরণের প্রয়োজন হয়। উদাহরণস্বরূপ, আপনি যদি char x; int y;ক্লাসের ভিতরে রাখেন তবে আমার জিসিসি এটি আটটি বাইটে আটকে রেখেছে (যেহেতু দ্বিতীয়টি অবশ্যই অবশ্যই এটির প্রয়োগের সাথে সংযুক্ত করা উচিত)।


"শূন্য নয়" এর কারণ হ'ল বিভিন্ন বস্তুর আলাদা ঠিকানা থাকতে হবে। শূন্য-আকারের অবজেক্টগুলির একটি অ্যারে কল্পনা করুন। আপনি কিভাবে এটি সূচক হবে? কিছু ক্ষেত্রে, সংকলকটিকে এখুনি অপ্টিমাইজ করার অনুমতি দেওয়া হয়েছে (খালি বেস শ্রেণি অপ্টিমাইজেশন)
জাল্ফ

@ জালফ: "আপনি কীভাবে এটি সূচক করবেন?" আমি সি তে একইভাবে করব (উদাহরণস্বরূপ কাঠামোগুলির একটি অ্যারের জন্য) ??
Lazer

1
@ESKay - তাদের 0 টি আকার থাকলে আপনি পারতেন না। তারা সকলেই উপাদান 0 এ থাকতেন
ব্রায়ান নিল

1
@ ব্রায়ানিয়েল যা কোনও সমস্যা নয়, যেহেতু তাদের আলাদা করার মতো রাষ্ট্র নেই। আপনি কেবলমাত্র পয়েন্টার বিবেচনা করলেই সমস্যাগুলি উপস্থিত হয়।
gha.st

2
বা এর অ্যারেটির দৈর্ঘ্য গণনা করতে আকারটি নেওয়া হচ্ছে।
gha.st

6

একটি ব্যতিক্রম আছে: 0-দৈর্ঘ্যের অ্যারে

#include <iostream>

class CompletlyEmpty {
  char NO_DATA[0];
};

int main(int argc, const char** argv) {
  std::cout << sizeof(CompletlyEmpty) << '\n';
}

কেন কেউ এই উত্তর মন্তব্য করেনি? এটা আমার জন্য খুব কৌতূহলী বলে মনে হচ্ছে।
পেরিগ্রেং-এলকে

আপনি যদি দুটি "কমপ্লিটলিম্পেটি" অবজেক্ট তৈরি করেন (উদাহরণস্বরূপ 'a' এবং 'b'), মাপের মতে তারা 0 বাইট দীর্ঘ, তবে এর ঠিকানাগুলি বিভক্ত ('& a == & b' মিথ্যা মূল্যায়ন করে)। এবং এটি অসম্ভব হওয়া উচিত ... (জি ++ 4.7.2 ব্যবহার করে)।
পেরেজিং-এলকে

1
কিন্তু আপনি এই বস্তু, বলুন, একটি অ্যারের তৈরি করে c, &c[M] == &c[N]যে জন্য Mএবং N(ঝনঝন ++, 4.1)।
কনস্ট্যান্টিন নিকিতিন

5
সি এবং সি ++ শূন্য দৈর্ঘ্যের অ্যারেগুলিকে অনুমতি দেয় না। আপনার সংকলকটি পারে তবে এটি ভুল।
কনরাড বোরোস্কি

হ্যাঁ, ক্লাসের আকারটি নিজেই শূন্য, তবে এই শ্রেণীর উদাহরণ এখনও 1 বাইট।
ZeR0

5

যদিও খালি ক্লাসের জন্য কোনও মেমোরি বরাদ্দ করার প্রয়োজন নেই, তবে শূন্য শ্রেণীর অবজেক্ট তৈরি করতে সংকলক ন্যূনতম মেমোরি নির্ধারণ করে যা 1 বাইট। এইভাবে সংকলক একই খালি শ্রেণির দুটি অবজেক্টকে স্বতন্ত্রভাবে পার্থক্য করতে পারে এবং খালি শ্রেণির প্রকারের পয়েন্টারে অবজেক্টের ঠিকানা বরাদ্দ করতে সক্ষম হবে।



3

এই তোমার দর্শন লগ করা সাহায্য করতে পারে :-) http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a

খালি শ্রেণি বা কাঠামোর আকার 1

স্ট্যান্ডার্ডটি যথাযথভাবে প্রয়োগ করতে এই ঘটনাটি ফুটে উঠেছে, সি ++ স্ট্যান্ডার্ডের একটি বিষয় হ'ল "কোনও বস্তুর স্মৃতিতে অন্য ভেরিয়েবলের মতো একই ঠিকানা থাকবে না" .... এটি নিশ্চিত করার সহজতম উপায় কী? নিশ্চিত করুন যে সমস্ত ধরণের একটি শূন্য-আকারের রয়েছে। এটি অর্জনের জন্য সংকলকটি কাঠামোগত কাঠামোগুলি এবং ক্লাসগুলিতে একটি ডামি বাইট যুক্ত করে যার কোনও ডেটা সদস্য এবং কোনও ভার্চুয়াল ফাংশন নেই যাতে তাদের আকার 0 এর চেয়ে 1 আকার হয় এবং তারপরে তাদের অনন্য মেমরি ঠিকানা থাকার নিশ্চয়তা দেওয়া হয়।


2

খালি শ্রেণির জন্য 1 বাইট বরাদ্দ করা সংকলক নির্ভর। কম্পাইলারদের নিশ্চিত করতে হবে যে বিভিন্ন মেমরি লোকেশনে অবজেক্টগুলি বাস করছে এবং তাদের কোনও বস্তুর কাছে শূন্য নয় মেমরির আকার বরাদ্দ করতে হবে। এই বিষয়ে এখানে নোটগুলি শুনুন: http://listenvoice.com/listenVoiceNote.aspx?id=27

যদিও সংকলকগুলি শূন্য শ্রেণীর জন্য শূন্য আকারের বরাদ্দ দেয় তারা খালি ক্লাস থেকে নতুন ক্লাস প্রাপ্ত হওয়ার সাথে সাথে তারা অপ্টিমাইজেশনও করে। লিসনিভয়েসের সি ++ প্রোগ্রামিং সাক্ষাত্কারের প্রশ্নগুলিতে ফাঁকা বেস অপ্টিমাইজেশন সম্পর্কে শুনুন।


2

কোনও ডেটা সদস্যবিহীন শ্রেণির কারণ নয় তবে আকার 1 বাইট রয়েছে এটি হ'ল এই শক্তিশালী পাঠ্যটি অবশ্যই মেমরিতে সংরক্ষণ করতে হবে যাতে কোনও রেফারেন্স বা পয়েন্টারটি সেই শ্রেণীর অবজেক্টের দিকে নির্দেশ করতে পারে


0

খালি ক্লাস - ক্লাসে কোনও বিষয়বস্তু থাকে না।

যে ক্লাসটি খালি নেই তা মেমরির মাধ্যমে তার সামগ্রী দ্বারা প্রতিনিধিত্ব করা হবে।

এখন খালি শ্রেণি কীভাবে স্মৃতিতে উপস্থাপিত হবে? যেহেতু এটিতে কোনও বিষয়বস্তু মেমরিতে তার উপস্থিতি দেখানোর উপায় নেই তবে শ্রেণি উপস্থিত রয়েছে, স্মৃতিতে এটি উপস্থিতি প্রদর্শন করা বাধ্যতামূলক। মেমরিতে খালি শ্রেণীর উপস্থিতি দেখানোর জন্য 1 বাইট প্রয়োজন।


0

আমি মনে করি এটি এতটা কারণ 1 বাইট হ'ল ক্ষুদ্রতম মেমরি ইউনিট যা স্থানধারক হিসাবে ব্যবহার করা যেতে পারে, এবং এটি শূন্য আকার দিতে পারে না কারণ এটি সামগ্রীর অ্যারে তৈরি করা সম্ভব হবে না ..

এবং আপনি যে জিনিসটি বলেছিলেন "এটি আমার কাছে একটু আশ্চর্য হয়েছিল যেহেতু আমি এটি মেশিন শব্দের (32 বিট বা 4 বাইট) আকারের আশা করছিলাম।" খালি () টাইপের রেফারেন্স ভেরিয়েবল (ম্যাসিন শব্দ) এর ক্ষেত্রে সত্য হবে, শ্রেণীর আকার নিজেই নয় (যা বিমূর্ত ডাটা টাইপ),


0

আমি মনে করি এই প্রশ্নটি কেবল তাত্ত্বিক স্বার্থের তবে বাস্তবে এটি কোনও বিষয় নয়।

যেমন অন্যদের দ্বারা ইতিমধ্যে চিহ্নিত করা হয়েছে, খালি শ্রেণি থেকে প্রাপ্ত কোনও ক্ষতি করে না, কারণ এটি বেস শ্রেণীর অংশের জন্য কোনও অতিরিক্ত মেমরি গ্রাস করবে না।

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

নীচের লাইন: আপনি যদি নিজেকে খালি শ্রেণিতে দশম লিখতে দেখেন তবে কেবলমাত্র সমস্ত সদস্যের কার্যগুলি স্থির করুন। তারপরে আপনাকে এক্স অবজেক্ট তৈরি করার প্রয়োজন হবে না এবং উত্পন্ন ক্লাসগুলি কোনওভাবেই প্রভাবিত হবে না।


0
#include<iostream>
using namespace std;


    class Empty { };
    int main()
    {
        Empty* e1 = new Empty;
        Empty* e2 = new Empty;

        if (e1 == e2)
            cout << "Alas same address of two objects" << endl;
        else
            cout << "Okay it's Fine to have different addresses" << endl;

        return 0;
    }

আউটপুট: ঠিক আছে এটির বিভিন্ন ঠিকানা থাকা ভাল

আয়তন 1 পুনরুদ্ধার করে তা নিশ্চিত করে যে দুটি বস্তুর একই ঠিকানা থাকবে না।


0

দুটি পৃথক বস্তুর আলাদা ঠিকানা থাকবে তা নিশ্চিত করা ননজারো। বিভিন্ন বস্তুর আলাদা ঠিকানা থাকতে হবে, তাই খালি শ্রেণির আকার সর্বদা 1 বাইট।


-2

আমি মনে করি যে খালি শ্রেণির আকার শূন্য হলে এর অর্থ এটি বিদ্যমান নেই। এটি (শ্রেণি) বিদ্যমান থাকার জন্য এটির কমপক্ষে 1 বাইট থাকা দরকার, কারণ এই বাইটটি মেমরি / রেফারেন্স ঠিকানা।


-3

এটি এই পয়েন্টারের কারণে , যদিও পয়েন্টারটি 4 বাইটের (পূর্ণসংখ্যা) তবে এটি একটি মেমরির অবস্থান (একটি ইউনিট) যা 1 বাইট উল্লেখ করে।


5
দুঃখিত, তবে এটি আজেবাজে কথা।
jogojapan

@ নারায়ণ দাশ খাত্রী: প্রথমে পয়েন্টারের ধরণটি ডেটা টাইপের উপর নির্ভর করে তার সর্বদা নয় এবং দ্বিতীয়টি পয়েন্টারের আকারটি মেশিন এবং কম্পাইলারের উপর নির্ভর করে 32 বিট মেশিনে এটি 4 বাইট এবং 64 বিট মেশিনের জন্য এটি 8 বাইট হয়।
কৃষ্ণা ওজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.