कक्षा की इस पद्धति पर विचार करें CameraTab

void CameraTab::onFocusWheelTick(int delta)
{
    const int lut[] = {0,1,3,6,8,16,32,62,90,120,240,500,700,900,1000};
    const int lut_len = sizeof(lut)/sizeof(lut[0]);
    ...
}

क्या इस वर्ग के सभी उदाहरण समान lut[] सरणी साझा करते हैं? क्या यह प्रत्येक विधि कॉल पर स्टैक में बनाया और नष्ट किया जाता है?

2
ABR 4 पद 2020, 20:05

1 उत्तर

सबसे बढ़िया उत्तर

उत्तर को पैडेंटिक सी ++ शर्तों में फ्रेम करने के लिए: प्रत्येक सी ++ कंपाइलर कोई भी अनुकूलन करने के लिए स्वतंत्र है जिसमें कोई अवलोकन योग्य अंतर नहीं है। आपका प्रश्न क्या है: क्या इस अनुकूलन का कोई अवलोकन योग्य अंतर नहीं होगा? पहली नज़र में ऐसा लगता है कि स्थिर दायरे में सरणी और चर का निर्माण, केवल एक बार, कोई देखने योग्य अंतर नहीं होगा। इसे संशोधित नहीं किया जा सकता है। यह हमेशा समान है। तो क्यों नहीं?

लेकिन इसमें संभावित रूप से देखने योग्य अंतर है। यह सरणी का पता है, या किसी सरणी का सूचक है। सी ++ में पॉइंटर्स की कुछ अर्थ संबंधी आवश्यकताएं होती हैं, विशेष रूप से उनके कुल ऑर्डर के संबंध में, जैसा कि तुलनात्मक फ़ंक्शन ऑब्जेक्ट्स द्वारा कार्यान्वित किया जाता है। विभिन्न निष्पादन थ्रेड्स के साथ, या यहां तक ​​​​कि एक निष्पादन थ्रेड जो इस फ़ंक्शन को पुनरावर्ती रूप से आमंत्रित करता है, आपके पास इन चरों के विभिन्न तार्किक उदाहरण होंगे। इन वस्तुओं के पॉइंटर्स सभी समान होंगे यदि वे स्थिर दायरे में निर्मित होते हैं। यह उनकी सापेक्ष कुल आदेश आवश्यकता का उल्लंघन करेगा।

यह देखने योग्य अंतर है। इसलिए, जब तक संकलक तार्किक रूप से यह साबित नहीं कर सकता कि इन वस्तुओं के कई उदाहरणों के लिए कोई संकेतक कभी भी मौजूद नहीं होगा, संकलक के पास उन्हें स्वचालित दायरे (स्टैक पर) बनाने के अलावा कोई विकल्प नहीं है।

और यदि आपका कंपाइलर यह साबित कर सकता है कि आपके प्रोग्राम में कोई देखने योग्य अंतर नहीं है: ऐसा कोई अनुकूलन करने के लिए कंपाइलर्स की अनुमति है, लेकिन आवश्यक नहीं है, तो क्या आपकी ऑब्जेक्ट्स स्थिर स्कोप में निर्मित हो जाएंगी या स्वचालित स्कोप पूरी तरह से आपके कंपाइलर के विवेक पर होगा .

3
Sam Varshavchik 4 पद 2020, 17:16