क्या कोई कृपया कोड और डेटा मेमोरी के बीच अंतर समझा सकता है। मुझे पता है कि कोड फ्लैश में संग्रहीत है और डेटा रैम में संग्रहीत है लेकिन मैं उलझन में हूं।

#include <iostream>
using namespace std;

int main()
{
    int a =10, b=20;
    int c = a+b;
    return 0;
}

यहाँ a, b, c को डेटा मेमोरी (RAM) में स्टोर किया जाता है, लेकिन कोड मेमोरी में क्या स्टोर होता है? क्या यह पूरा कोड कोड मेमोरी में संग्रहीत है? यदि हाँ, तो क्या इसका मतलब यह है कि हम डेटा और कोड मेमोरी दोनों में a,b,c स्टोर कर रहे हैं।

0
Tom 23 अगस्त 2020, 19:07

2 जवाब

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

आपके उदाहरण में, आपके कंपाइलर के अनुकूलन स्तर के आधार पर कई परिदृश्य।

"कोड मेमोरी" में रखे गए स्थिरांक

नीचे दिए गए कोड में:

int a =10, b=20;
int c = a+b;
return 0;

चर a और b अचर हैं, वे बदलते नहीं हैं। एक कंपाइलर इसे अनुकूलित कर सकता है और उन्हें अनुकूलित कर सकता है: इंट सी = 10 + 20; तो मान १० और २० को कोड मेमोरी में रखा जा सकता है, जिससे वेरिएबल्स a और b खत्म हो जाते हैं।

रजिस्टर मेमोरी नहीं

कंपाइलर को वेरिएबल्स a और b को रजिस्टर को असाइन करने की अनुमति है। रजिस्टर प्रोसेसर के भीतर होते हैं, इसलिए कोई रैम या मेमोरी स्पेस न लें। रजिस्टर कोड स्थान का भी हिस्सा नहीं हैं। (ऐसा इसलिए हो सकता है क्योंकि ऐसा कोई कथन नहीं है जिसके लिए a या b) के पतों की आवश्यकता हो)

सभी कोड गिराए गए

उच्च अनुकूलन सेटिंग्स पर, कंपाइलर आपके सभी कोड को हटा सकता है और एक return 0 से बदल सकता है।
चर a और b नहीं बदले गए हैं।
वेरिएबल c को बदल दिया गया है लेकिन किसी अन्य स्टेटमेंट द्वारा उपयोग नहीं किया गया है।
आपके प्रोग्राम का कोई प्रभाव नहीं है (कुछ भी मुद्रित नहीं है, हार्डवेयर पर लिखने जैसी कोई बाहरी क्रिया नहीं है)।
इस प्रकार आपका प्रोग्राम return 0; तक कम किया जा सकता है।

कोड मेमोरी बनाम डेटा मेमोरी

सामान्य तौर पर, प्रोसेसर निर्देश एक खंड में रखे जाते हैं जिसे आप "कोड मेमोरी" कहेंगे। यह वास्तव में RAM में रह सकता है और Flash या ROM में नहीं। उदाहरण के लिए, एक पीसी पर, आपका कोड हार्ड ड्राइव से रैम में लोड किया जा सकता है और रैम में निष्पादित किया जा सकता है। इसी तरह फ्लैश के साथ, आपका कोड फ्लैश से रैम में लोड किया जा सकता है और रैम में निष्पादित किया जा सकता है।

स्थिरांक, संख्याओं की तरह, केवल-पढ़ने के लिए खंड या कोड खंड में रखा जा सकता है। कई प्रोसेसर कोड सेगमेंट से स्थिरांक लोड कर सकते हैं (एआरएम और इंटेल असेंबली निर्देश देखें)। रीड-ओनली सेगमेंट रीड ओनली डिवाइस (रोम या फ्लैश) पर रह सकता है या रैम (या हार्ड ड्राइव जैसे डिवाइस पर) में रह सकता है। आप केवल यह गारंटी दे सकते हैं कि कोड केवल-पढ़ने के लिए खंड को नहीं लिखेगा।

डेटा मेमोरी अलग है। सी ++ भाषा में "डेटा" मेमोरी के कम से कम 3 क्षेत्र हैं (जहां चर रहते हैं): 1) स्थानीय (उर्फ स्टैक), जहां छोटे जीवनकाल चर रहते हैं; 2) गतिशील स्मृति (उर्फ ढेर), new या malloc और 3) स्वचालित/वैश्विक चर का उपयोग करके आवंटित। इन स्मृति क्षेत्रों को कहीं भी रखा जा सकता है, जब तक कि स्मृति ने और लिखने की क्षमता पढ़ ली हो। उन्हें तेज़ होने की आवश्यकता नहीं है, केवल पढ़ना और लिखना (उदाहरण के लिए, हार्ड ड्राइव को डेटा मेमोरी के रूप में उपयोग किया जा सकता है)।

मेमोरी संगठन कोड, स्टैक और हीप की तुलना में अधिक जटिल है। एम्बेडेड सिस्टम की दुनिया में, मेमोरी को गैर-मानक स्थानों में रखा जा सकता है और अधिक विस्तृत मेमोरी सेगमेंट की आवश्यकता हो सकती है ताकि उन्हें विभिन्न क्षेत्रों में रखा जा सके। उदाहरण के लिए, एक एम्बेडेड सिस्टम स्थिरांक को फ्लैश में रखना चाह सकता है ताकि उन्हें आसानी से बदला जा सके (भले ही उन्हें कोड सेगमेंट में अधिक कुशलता से एक्सेस किया जा सके)। कुछ कोड प्रोसेसर के बूट एरिया (जो प्रोसेसर निर्माता द्वारा प्रोग्राम किया जाता है) में रखा जाना चाह सकते हैं। कुछ एम्बेडेड सिस्टम में गैर-वाष्पशील मेमोरी (जैसे बैटरी समर्थित मेमोरी) हो सकती है, जो रीड-ओनली मेमोरी की तरह व्यवहार कर सकती है।

अपने कंपाइलर पर भरोसा करें

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

2
Thomas Matthews 23 अगस्त 2020, 23:04

एक त्वरित ओवरसिम्प्लीफिकेशन:

कोड मेमोरी आपके C++ कोड (ROM) से संकलित मशीनी भाषा निर्देशों के अनुक्रम को संग्रहीत करता है।

वास्तविक डेटा जो प्रोग्राम द्वारा बनाया और हेरफेर किया जाता है, इसके बजाय RAM में संग्रहीत किया जाता है, जिसे स्टैक और हीप से बना समझा जा सकता है: डेटा धीमी, लेकिन बड़े ढेर में संग्रहीत किया जाता है, जबकि इसके पते स्टैक में पॉइंटर्स द्वारा बनाए रखा जाता है। स्टैक को तेज मेमोरी रजिस्टर में होस्ट किया जाता है।

स्टैक में पॉइंटर्स ढेर में डेटा पुनर्प्राप्त करते हैं जब रोम में वर्तमान निर्देश लाइन द्वारा ऐसा कहा जाता है, या जब आवश्यक हो तो सामान्य रूप से अधिक।

1
Lingo 23 अगस्त 2020, 20:00