दिलचस्प पोस्ट
केवल तत्व के लिए सीएसएस शैलियाँ रीसेट / हटाएं त्रुटि: (26, 0) Gradle DSL विधि नहीं मिली: 'रनप्रागार्ड ()' मैक ओएस एक्स में टर्मिनल विंडो में कोड चिपकाने के लिए कमांड स्विफ्ट के बाद टर्मिनल आउटपुट प्राप्त करें मंडल केंद्रों को आसानी से जोड़ने एसक्यूएल जोन और विभिन्न प्रकार के जॉन्स window.focus () Google Chrome में काम नहीं कर रहा है एक वेब पेज के लोड और निष्पादन अनुक्रम? एक्सेस प्रतिबंध: आवश्यक पुस्तकालय पर प्रतिबंध के कारण पहुंच योग्य नहीं है .. \ jre \ lib \ rt.jar CUDA ब्लॉक / युद्ध / धागे CUDA कोर पर कैसे नक्शा करते हैं? कैसे "पूरी तरह से" एक dict पर ओवरराइड? एंड्रॉइड: टेक्स्टव्यू हाइपरलिंक मैं Python के easy_install के साथ स्थापित संकुल को कैसे निकालूं? हम लॉगरर्स को स्थिर फाइनल क्यों घोषित करते हैं? PHP लिप्यांतरण

सी ++ में स्थिर सरणी बनाम गतिशील सरणी

सी ++ में एक स्थिर सरणी और एक गतिशील सरणी के बीच अंतर क्या है?

मुझे अपनी कक्षा के लिए असाइनमेंट करना होगा और यह कहता है कि स्थिर ऐरेज़ का उपयोग न करें, केवल गतिशील एरेज़ मैंने किताब और ऑनलाइन में देखा है, लेकिन मुझे समझ में नहीं आता।

मैंने सोचा कि स्थिर समय पर संकलन और गतिशील समय पर संकलित किया गया था, लेकिन मैं स्मृति आवंटन के साथ यह समझ सकता हूँ।

क्या आप सी ++ में स्थिर सरणी और गतिशील सरणी के बीच का अंतर समझा सकते हैं?

वेब के समाधान से एकत्रित समाधान "सी ++ में स्थिर सरणी बनाम गतिशील सरणी"

स्थानीय सरणियों को स्टैक पर बनाया जाता है, और स्वचालित संग्रहण अवधि होती है – आपको मैन्युअल रूप से मेमोरी प्रबंधन करने की आवश्यकता नहीं होती है, लेकिन वे तब समाप्त हो जाते हैं जब फ़ंक्शन समाप्त होते हैं उनके पास एक निश्चित आकार है:

int foo[10]; 

operator new[] के साथ बनाई गई एआरएआर operator new[] गतिशील भंडारण अवधि है और ढेर (तकनीकी रूप से "मुफ्त स्टोर") पर जमा हो जाती है। उनके पास कोई आकार हो सकता है, लेकिन उन्हें उन्हें आवंटित करने की आवश्यकता है क्योंकि वे स्टैक फ्रेम का हिस्सा नहीं हैं:

 int* foo = new int[10]; delete[] foo; 

स्थैतिक सी और सी ++ में एक कीवर्ड है, इसलिए किसी सामान्य वर्णनात्मक शब्द के बजाय, स्थैतिक का बहुत विशिष्ट अर्थ है जब एक चर या सरणी पर लागू होता है भ्रम को व्यवस्थित करने के लिए, इसमें अलग-अलग संदर्भों के भीतर तीन अलग-अलग अर्थ हैं। इसके कारण, एक स्थिर सरणी या तो स्थिर या गतिशील हो सकती है

मुझे समझाने दो:

पहला सी ++ विशिष्ट है:

  • एक स्थिर वर्ग का सदस्य एक ऐसा मूल्य है जो कंस्ट्रक्टर के साथ शुरू नहीं होता है या नाशक के साथ हटाया जाता है। इसका मतलब है कि सदस्य को आरंभ और कुछ अन्य तरीके से बनाए रखा जाना चाहिए। स्थिर सदस्य पॉइंटर्स को रिक्त करने के लिए प्रारंभ किया जा सकता है और फिर पहली बार एक कन्स्ट्रक्टर को कहा जाता है। (हां, यह स्थिर और गतिशील होगा)

दो सी से विरासत में मिली हैं:

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

  • फ़ंक्शन के बाहर घोषित स्थिर वैरिएबल ग्लोबल वैरिएबल हैं जिन्हें केवल उसी मॉड्यूल के भीतर से पहुंचा जा सकता है (किसी भी अन्य # के साथ स्रोत कोड फ़ाइल)

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

मुझे लगता है कि आपके कक्षा में इस्तेमाल होने वाले शब्दों को भ्रमित कर रहे हैं। 'स्थिर' से क्या मतलब है, बस "स्थिर आकार" है, और "गतिशील" का क्या अर्थ है "चर आकार" है उस स्थिति में, एक निरंतर आकार सरणी इस तरह दिख सकती है:

 int x[10]; 

और एक "गतिशील" एक बस किसी भी प्रकार का ढांचा होगा जो कि अंतर्निहित भंडारण के लिए रनटाइम में वृद्धि या कमी की अनुमति देता है ज्यादातर समय, सी ++ मानक पुस्तकालय से std::vector वर्ग पर्याप्त होगा। इसे इस तरह प्रयोग करें:

 std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized. 

std::vector में operator[] परिभाषित किया गया है, ताकि आप इसे उसी शब्दों के साथ एक सरणी के रूप में उपयोग कर सकें।

स्थिर एरे को समय संकलन पर स्मृति आवंटित किया जाता है और स्मृति को ढेर पर आवंटित किया जाता है। जबकि, गतिशील arrays रनटाइम पर स्मृति आवंटित कर रहे हैं और स्मृति ढेर से आवंटित किया गया है।

 int arr[] = { 1, 3, 4 }; // static integer array. int* arr = new int[3]; // dynamic integer array. 

मुझे लगता है कि इस संदर्भ में इसका अर्थ है कि यह स्थिर है कि आकार तय हो गया है। Std :: vector का उपयोग करें इसमें एक आकार परिवर्तन () फ़ंक्शन है।

क्या शब्दों का मतलब है की स्पष्ट परिभाषा के लिए महत्वपूर्ण है दुर्भाग्यवश, क्या स्थिर और गतिशील arrays का मतलब है की कई परिभाषाएं दिखाई देती हैं।

स्थैतिक चर स्थिर स्मृति आवंटन का उपयोग करके परिभाषित चर हैं। यह सी / सी ++ से स्वतंत्र एक सामान्य अवधारणा है सी / सी ++ में हम इस तरह वैश्विक, फ़ाइल या स्थानीय क्षेत्र के साथ स्थिर चर बना सकते हैं:

 int x[10]; //static array with global scope static int y[10]; //static array with file scope foo() { static int z[10]; //static array with local scope 

स्वचालित चर को आमतौर पर स्टैक-आधारित स्मृति आवंटन के द्वारा उपयोग किया जाता है एक स्वचालित सरणी इस तरह सी / सी ++ में बनाई जा सकती है:

 foo() { int w[10]; //automatic array 

इन सरणियों, x, y, z , और w में क्या समान है, यह है कि उनमें से प्रत्येक का आकार तय हो गया है और समय संकलन में परिभाषित किया गया है।

एक कारण यह है कि एक स्वत: सरणी और एक स्थिर सरणी के बीच अंतर को समझना महत्वपूर्ण है यह है कि स्थिर संग्रहण आमतौर पर किसी ऑब्जेक्ट फ़ाइल के डेटा अनुभाग (या बीएसएस अनुभाग ) में कार्यान्वित किया जाता है और संकलक सरणियों तक पहुंचने के लिए पूर्ण पते का उपयोग कर सकता है जो स्टैक-आधारित स्टोरेज के साथ असंभव है

आमतौर पर एक डायनामिक सरणी से क्या मतलब है वह एक है जो पुन: आकारणीय नहीं है, लेकिन रन-टाइम पर निर्धारित निश्चित आकार के साथ गतिशील स्मृति आवंटन का उपयोग करके एक को लागू किया गया है। सी ++ में यह new ऑपरेटर का उपयोग किया जाता है।

 foo() { int *d = new int[n]; //dynamically allocated array with size n 

लेकिन alloca का उपयोग कर रनटाइम पर निर्धारित फिक्स आकार के साथ एक स्वचालित सरणी बनाना संभव है:

 foo() { int *s = (int*)alloca(n*sizeof(int)) 

सच्चे गतिशील सरणी के लिए सी + + (या सी में एक चर लंबाई सरणी ) में std::vector जैसा कुछ उपयोग करना चाहिए।

ओपी सवाल में काम के लिए क्या मतलब था? मुझे लगता है कि यह स्पष्ट है कि जो चाहता था वह एक स्थिर या स्वत: सरणी नहीं था, लेकिन वह एक जो कि new ऑपरेटर या गैर-निश्चित आकार के सरणी का प्रयोग करते हुए गतिशील स्मृति आवंटन का प्रयोग करता है जैसे std::vector

हां सही संकलन समय पर स्थिर सरणी बनाई जाती है, जहां गतिशील सरणी को चलाने के समय पर बनाया गया है। जहां तक ​​अंतर उनके स्मृति स्थानों से संबंधित है, जहां स्थिर स्टैक पर स्थित है और गतिशील ढेर पर बनाया जाता है। ढेर पर स्थित हर चीज को स्मृति प्रबंधन की आवश्यकता होती है और जब तक कि कण कलेक्टर जैसे नेट ढांचे के मामले में उपस्थित नहीं होता है अन्यथा स्मृति रिसाव का खतरा होता है।

स्थिर सरणी: दक्षता कोई गतिशील आवंटन या deallocation की आवश्यकता नहीं है।

स्थैतिक संशोधक सहित कार्य में सी, सी ++ में घोषित सरणी स्थिर हैं। उदाहरण: स्थिर इंट फ़ू [5];

आपके पास छद्म गतिशील सरणी हो सकती है, जहां क्रम उपयोगकर्ता पर रनटाइम पर सेट होता है, लेकिन इसके बाद उसके बाद तय हो जाता है

 int size; cin >> size; int dynamicArray[size]; 

सरणी में तरफ तत्वों को देने के साथ स्थिर आरी मेन्स

सरणी में तरफ तत्वों को देने के बिना गतिशील तीर मीन

उदाहरण:

  char a[10]; //static array char a[]; //dynamic array