নিম্নলিখিতটি অবশ্যই সমস্তগুলি যথাযথ নয়। আপনি যখন এটি পড়বেন তখন লবণের এক দানা দিয়ে নিয়ে যান :)
ভাল, আপনি যে তিনটি বিষয় উল্লেখ করেছেন তা হ'ল স্বয়ংক্রিয়, স্থিতিশীল এবং গতিশীল স্টোরেজ সময়কাল , যার কতক্ষণ অবজেক্টগুলি বেঁচে থাকে এবং কখন তারা জীবন শুরু করে তার সাথে কিছু সম্পর্ক রয়েছে।
স্বয়ংক্রিয় স্টোরেজ সময়কাল
আপনি স্বল্পকালীন এবং ছোট ডেটার জন্য স্বয়ংক্রিয় স্টোরেজ সময়কাল ব্যবহার করেন , এটি কেবলমাত্র কিছু ব্লকের মধ্যে স্থানীয়ভাবে প্রয়োজন :
if(some condition) {
int a[3]; // array a has automatic storage duration
fill_it(a);
print_it(a);
}
আমরা ব্লক থেকে প্রস্থান করার সাথে সাথে জীবনকাল শেষ হয়ে যায় এবং অবজেক্টটি সংজ্ঞায়িত হওয়ার সাথে সাথে এটি শুরু হয়। এগুলি হ'ল স্টোরেজ সময়কালের সবচেয়ে সাধারণ ধরণের এবং নির্দিষ্ট গতিশীল স্টোরেজ সময়কালের চেয়ে বেশ দ্রুত গতিযুক্ত।
স্ট্যাটিক স্টোরেজ সময়কাল
আপনি স্থিতিশীল স্টোরেজ সময়কাল ফ্রি ভেরিয়েবলের জন্য ব্যবহার করেন যা কোনও কোড দ্বারা সর্বদা অ্যাক্সেস করা হতে পারে, যদি তাদের স্কোপ এ জাতীয় ব্যবহারের (নাম স্পেস স্কোপ) অনুমতি দেয় এবং স্থানীয় ভেরিয়েবলগুলির জন্য যা তাদের স্কোপ (স্থানীয় সুযোগ) থেকে বেরিয়ে যাওয়ার সময়কালে তাদের আজীবন প্রসারিত করতে পারে এবং সদস্য ভেরিয়েবলগুলির জন্য যা তাদের শ্রেণীর সমস্ত শ্রেণীর (শ্রেণির ক্ষেত্র) ভাগ করে নেওয়া দরকার। তাদের জীবদ্দশায় তারা যে স্কোপ রয়েছে তার উপর নির্ভর করে They তাদের নেমস্পেসের সুযোগ এবং স্থানীয় সুযোগ এবং শ্রেণির সুযোগ থাকতে পারে । এই দু'জনের ক্ষেত্রে যা সত্য তা হ'ল একবার তাদের জীবন শুরু হওয়ার পরে প্রোগ্রামটির শেষে জীবনকাল শেষ হয় । এখানে দুটি উদাহরণ দেওয়া হল:
// static storage duration. in global namespace scope
string globalA;
int main() {
foo();
foo();
}
void foo() {
// static storage duration. in local scope
static string localA;
localA += "ab"
cout << localA;
}
প্রোগ্রামটি মুদ্রণ করে ababab
, কারণ localA
এটির ব্লকটি প্রস্থান করার পরে ধ্বংস হয় না। আপনি বলতে পারেন যে স্থানীয় অবকাশ রয়েছে এমন অবজেক্টগুলি যখন তাদের সংজ্ঞাতে পৌঁছায় আজীবন শুরু হয় । কারণ localA
, যখন ফাংশনের শরীরে প্রবেশ করা হয় তখন এটি ঘটে। নাম স্পেসের অবজেক্টগুলির জন্য, জীবনকাল প্রোগ্রামের শুরুতে শুরু হয় । শ্রেণীর সুযোগের স্থির বস্তুর ক্ষেত্রেও এটি একই:
class A {
static string classScopeA;
};
string A::classScopeA;
A a, b; &a.classScopeA == &b.classScopeA == &A::classScopeA;
যেমন আপনি দেখতে পাচ্ছেন, classScopeA
এটি তার শ্রেণীর নির্দিষ্ট বিষয়গুলির সাথে সীমাবদ্ধ নয়, বরং শ্রেণীর মধ্যেই। উপরের তিনটি নামের ঠিকানা একই এবং সমস্ত একই জিনিসকে বোঝায়। স্থির অবজেক্টগুলি কখন এবং কীভাবে শুরু করা হয় সে সম্পর্কে বিশেষ নিয়ম রয়েছে তবে আসুন এখন সে বিষয়ে উদ্বেগ প্রকাশ করা উচিত নয়। এটি স্ট্যাটিক ইনিশিয়ালাইজেশন অর্ডার ফিয়াসক শব্দটি দ্বারা বোঝানো হয়েছে ।
গতিশীল স্টোরেজ সময়কাল
শেষ সঞ্চয়ের সময়কাল গতিশীল। আপনি যদি অন্য আইল্যান্ডে অবজেক্টগুলি থাকতে চান তবে আপনি এটি ব্যবহার করেন এবং আপনি সেই রেফারেন্সের চারদিকে পয়েন্টার রাখতে চান। আপনার জিনিসগুলি বড় হলে আপনি সেগুলিও ব্যবহার করেন এবং আপনি যদি রানটাইমে পরিচিত আকারের অ্যারেগুলি তৈরি করতে চান তবে । এই নমনীয়তার কারণে, গতিশীল স্টোরেজ সময়কালযুক্ত অবজেক্টগুলি জটিল এবং পরিচালনা করতে ধীর হয়। যখন কোনও উপযুক্ত নতুন অপারেটরের অনুরোধ ঘটে তখন সেই গতিশীল সময়কালীন অবজেক্টগুলি আজীবন শুরু হয়:
int main() {
// the object that s points to has dynamic storage
// duration
string *s = new string;
// pass a pointer pointing to the object around.
// the object itself isn't touched
foo(s);
delete s;
}
void foo(string *s) {
cout << s->size();
}
আপনি যখন তাদের জন্য মুছুন কল করুন তখনই তার জীবনকাল শেষ হবে । যদি আপনি এটি ভুলে যান তবে সেই জিনিসগুলি কখনই আজীবন শেষ হয় না। এবং শ্রেণীর অবজেক্টস যা কোনও ব্যবহারকারী ঘোষিত কনস্ট্রাক্টরকে সংজ্ঞায়িত করে তাদের ডিস্ট্রাক্টরদের ডাকা হবে না। গতিশীল স্টোরেজ সময়কালীন অবজেক্টগুলির জন্য তাদের জীবনকাল এবং সম্পর্কিত মেমরি রিসোর্সের ম্যানুয়াল হ্যান্ডলিং প্রয়োজন। এগুলির ব্যবহার সহজ করার জন্য গ্রন্থাগারগুলি বিদ্যমান। নির্দিষ্ট সামগ্রীর জন্য স্পষ্ট আবর্জনা সংগ্রহ একটি স্মার্ট পয়েন্টার ব্যবহার করে প্রতিষ্ঠিত করা যেতে পারে:
int main() {
shared_ptr<string> s(new string);
foo(s);
}
void foo(shared_ptr<string> s) {
cout << s->size();
}
কলটি মুছে ফেলা সম্পর্কে আপনার কোনও চিন্তা করার দরকার নেই: ভাগ করা পিটিআর এটি আপনার জন্য করে, যদি শেষ পয়েন্টারটি উল্লেখ করে যে বস্তুটি সুযোগের বাইরে চলে যায়। ভাগ করা পিটিআর এর স্বয়ংক্রিয় স্টোরেজ সময়কাল। সুতরাং এর জীবনকালটি স্বয়ংক্রিয়ভাবে পরিচালিত হয়, এটি এটির পরীক্ষককে বিন্দুতে গতিশীল অবজেক্টটি মুছতে হবে কিনা তা যাচাই করার অনুমতি দেয়। Shared_ptr অবগতির জন্য, বুস্ট নথি দেখুন: http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/shared_ptr.htm