উত্তর:
ফাংশন static
ভেরিয়েবলগুলির আজীবন প্রথমবার শুরু হয় [0] প্রোগ্রাম প্রবাহ ঘোষণার মুখোমুখি হয় এবং এটি প্রোগ্রাম সমাপ্তিতে শেষ হয়। এর অর্থ হল যে রান-টাইমটি অবশ্যই এটি নির্মাণ করা হয়েছে কেবল তখনই এটি ধ্বংস করার জন্য কিছু বই সম্পাদন করতে হবে।
অতিরিক্ত হিসাবে, যেহেতু স্ট্যান্ডার্ডটি বলে যে স্থির বস্তুর ধ্বংসকারীদের অবশ্যই তাদের নির্মাণকাজ সমাপ্তির বিপরীতে চালানো উচিত [1] , এবং নির্মাণের ক্রম নির্দিষ্ট প্রোগ্রামের উপর নির্ভরশীল হতে পারে, তাই নির্মাণের ক্রমটি অবশ্যই বিবেচনায় নেওয়া উচিত ।
উদাহরণ
struct emitter {
string str;
emitter(const string& s) : str(s) { cout << "Created " << str << endl; }
~emitter() { cout << "Destroyed " << str << endl; }
};
void foo(bool skip_first)
{
if (!skip_first)
static emitter a("in if");
static emitter b("in foo");
}
int main(int argc, char*[])
{
foo(argc != 2);
if (argc == 3)
foo(false);
}
আউটপুট:
সি:> નમૂના.exe
foo এ তৈরি হয়েছিল ফু- তে
ধ্বংস হয়ে গেছেসি:> sample.exe 1
নির্মিত যদি
foo বিন্যাস সালে সৃষ্ট তৈরি হয়েছে
foo বিন্যাস ধ্বংস
যদি ধ্বংসসি:> নমুনা.এক্সএই 2 2
foo এ
তৈরি করা হয়েছে যদি ফু-তে
ধ্বংস হয়ে যায় তবে
ধ্বংস হয়
[0]
যেহেতু সি ++ 98 [2] এর একাধিক থ্রেডের কোনও উল্লেখ নেই যে এটি একাধিক থ্রেড পরিবেশে কীভাবে আচরণ করা হবে তা অনির্ধারিত, এবং রডির উল্লেখ করার সাথে সাথে সমস্যা হতে পারে ।
[1]
সি ++ 98 বিভাগ 3.6.3.1
[বেসিক.স্টার্ট.মিটার]
[2]
সি ++ এ 11 স্ট্যাটিক্সটি থ্রেড নিরাপদ উপায়ে শুরু করা হয়েছে, এটি ম্যাজিক স্ট্যাটিকস নামেও পরিচিত ।
[basic.start.term]
মোটি অর্ডার সম্পর্কে সঠিক, তবে বিবেচনা করার মতো আরও কিছু জিনিস রয়েছে:
সংস্থাগুলি স্থানীয় স্ট্যাটিক্স ইতিমধ্যে সূচনা করা হয়েছে কিনা তা নির্দেশ করতে সাধারণত একটি লুকানো পতাকা চলক ব্যবহার করে এবং এই পতাকাটি ফাংশনে প্রতিটি প্রবেশের সময় পরীক্ষা করা হয়। স্পষ্টতই এটি একটি ছোট পারফরম্যান্স হিট, তবে উদ্বেগের আরও বেশি বিষয় হ'ল এই পতাকাটি থ্রেড-সেফ হওয়ার গ্যারান্টিযুক্ত নয়।
উপরের মতো যদি আপনার স্থানীয় স্থিতিশীল থাকে এবং foo
একাধিক থ্রেড থেকে ডাকা হয়, আপনার কাছে জাতিগত অবস্থা হতে plonk
পারে যা ভুলভাবে বা একাধিকবার আরম্ভ হতে পারে। এছাড়াও, plonk
এক্ষেত্রে এটি যেটি নির্মাণ করেছে তার চেয়ে আলাদা থ্রেড দ্বারা ধ্বংস হতে পারে।
স্ট্যান্ডার্ড যা বলে তা সত্ত্বেও, আমি স্থানীয় স্ট্যাটিক ধ্বংসের প্রকৃত ক্রম সম্পর্কে খুব সতর্ক থাকব, কারণ সম্ভবত এটি অবিচ্ছিন্নভাবে কোনও স্থির ধ্বংস হওয়ার পরেও বৈধ হওয়ার উপর নির্ভর করতে পারে এবং এটি খুঁজে পাওয়া সত্যিই কঠিন is
বিদ্যমান ব্যাখ্যাগুলি in. Standard-তে পাওয়া স্ট্যান্ডার্ডের আসল বিধি ছাড়া সত্যই সম্পূর্ণ নয়:
স্ট্যাটিক স্টোরেজ সময়কাল বা থ্রেড স্টোরেজ সময়কাল সহ সমস্ত ব্লক-স্কোপ ভেরিয়েবলের জিরো-ইনিশিয়ালাইজেশন অন্য কোনও সূচনা হওয়ার আগে সঞ্চালিত হয়। স্থিতিশীল স্টোরেজ সময়কাল সহ একটি ব্লক-স্কোপ সত্তার ধারাবাহিক সূচনা, যদি প্রযোজ্য হয় তবে এর ব্লকটি প্রথমে প্রবেশের আগে সম্পাদন করা হয়। স্ট্যাটিক বা থ্রেড স্টোরেজ সময়কাল সহ অন্যান্য ব্লক-স্কোপ ভেরিয়েবলের প্রাথমিক সূচনা করার জন্য একটি বাস্তবায়নের অনুমতি দেওয়া হয় যে নামাঙ্কিত সুযোগে স্থির বা থ্রেড স্টোরেজ সময়কাল সহ কোনও চলককে স্থিতিশীলভাবে সূচনা করার জন্য কোনও বাস্তবায়নের অনুমতি দেওয়া হয়। অন্যথায় এ জাতীয় পরিবর্তনশীল প্রথমদিকে নিয়ন্ত্রণ তার ঘোষণার মধ্য দিয়ে যায়; যেমন একটি পরিবর্তনশীল এটি আরম্ভের সমাপ্তির পরে প্রাথমিক হিসাবে বিবেচিত হয়। যদি কোনও ব্যতিক্রম ছুঁড়ে সূচনাটি প্রস্থান করে, প্রারম্ভিককরণটি সম্পূর্ণ নয়, সুতরাং পরবর্তী সময় নিয়ন্ত্রণ ঘোষণায় প্রবেশ করার পরে এটি আবার চেষ্টা করা হবে। ভেরিয়েবলটি আরম্ভ করার সময় যদি নিয়ন্ত্রণ একসাথে ঘোষণায় প্রবেশ করে, একযোগে সম্পাদন শুরুকরণের সমাপ্তির জন্য অপেক্ষা করবে। পরিবর্তনটি আরম্ভ করার সময় যদি নিয়ন্ত্রণ পুনরাবৃত্তভাবে ঘোষণাকে পুনরায় প্রবেশ করে, আচরণটি নির্ধারিত।
FWIW, কোডগিয়ার সি ++ বিল্ডার মান অনুযায়ী প্রত্যাশিত ক্রমে ধ্বংস করবেন না।
C:\> sample.exe 1 2
Created in foo
Created in if
Destroyed in foo
Destroyed in if
... ধ্বংসের আদেশের উপর নির্ভর না করার আরেকটি কারণ!
স্ট্যাটিক ভেরিয়েবল একবার খেলার মধ্যে এসেছেন প্রোগ্রাম সঞ্চালনের শুরু এবং এটি প্রোগ্রাম সঞ্চালনের প্রান্ত পর্যন্ত পাওয়া যায়।
স্ট্যাটিক ভেরিয়েবলগুলি মেমোরির ডেটা বিভাগে তৈরি করা হয় ।