मैं एक समारोह के भीतर स्थैतिक चर की अंतर्निहित कार्यान्वयन के बारे में उत्सुक हूँ।संकलक द्वारा स्थिर स्थिर चर प्रारंभिकरण कैसे लागू किया जाता है?
यदि मैं एक मौलिक प्रकार (चार, int, double, आदि) का स्थिर चर घोषित करता हूं, और इसे प्रारंभिक मान देता हूं, तो मुझे लगता है कि संकलक बस उस चर के मूल्य को उस शुरुआत में सेट करता है main()
से पहले कार्यक्रम कहा जाता है:
void SomeFunction();
int main(int argCount, char ** argList)
{
// at this point, the memory reserved for 'answer'
// already contains the value of 42
SomeFunction();
}
void SomeFunction()
{
static int answer = 42;
}
हालांकि, अगर स्थिर चर एक वर्ग का एक उदाहरण है:
class MyClass
{
//...
};
void SomeFunction();
int main(int argCount, char ** argList)
{
SomeFunction();
}
void SomeFunction()
{
static MyClass myVar;
}
मुझे पता है कि यह पहली बार है कि समारोह में कहा जाता है जब तक आरंभ नहीं किया जा जाएगा । चूंकि संकलक को यह जानने का कोई तरीका नहीं है कि फ़ंक्शन को पहली बार कब बुलाया जाएगा, यह इस व्यवहार को कैसे उत्पन्न करता है? क्या यह अनिवार्य रूप से फ़ंक्शन बॉडी में एक if-block पेश करता है?
static bool initialized = 0;
if (!initialized)
{
// construct myVar
initialized = 1;
}
क्या कुछ बदल गया? मैंने सुना है कि सी ++ 11 के बाद स्थैतिक प्रारंभिक प्रत्येक थ्रेड-सुरक्षित है। –
@VictorPolevoy: हाँ - जब यह उत्तर लिखा गया था, सी ++ 11 मौजूद नहीं था। सी ++ 11 में, मानक में धागा समर्थन शामिल था, और इसे ब्लॉक-स्कोप स्थिर चर (6.7/4) के प्रारंभिक विवरण के विवरण में जोड़ा गया था: "यदि नियंत्रण प्रारंभिक होने पर एक साथ घोषणा में प्रवेश करता है, समवर्ती निष्पादन प्रारंभिक समापन के लिए इंतजार करेंगे "। –
मेरा सुझाव है कि आप अपना उत्तर संपादित करें क्योंकि इसे उत्तर के रूप में स्वीकार किया गया है और इसमें 10 वोट हैं। यह प्रश्न स्थैतिक चर के प्रारंभिक विषय के विषय के साथ सबसे अधिक देखने योग्य है। –