मेरे ज्ञान बहुत अल्पविकसित है, लेकिन जब यह जो मैं जानता हूँ कुछ इस तरह ढेर पर बनाई गई है से arrays के लिए आता है,टेम्पलेट पैरामीटर के रूप में ऐरे: ढेर या ढेर? ढेर की तुलना में ढेर के
float x[100];
जबकि कुछ इस तरह पर बनाई गई है ढेर
float* x = new float[100];
लेकिन क्या होता है अगर मैं एक टेम्पलेट सरणी वर्ग बनाने के लिए, और एक "ढेर" सरणी प्रकार (float[100]
की तरह) में इसे पारित? उदाहरण:
#include <iostream>
using namespace std;
template <class T>
class Array {
public:
int size;
T* data;
Array(int size_) : size(size_) {
data = new T[size];
}
~Array() {
delete [] data;
}
};
int main() {
int m = 1000000;
const int n = 100;
Array<float[n]>* array = new Array<float[n]>(m);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
array->data[i][j] = i * j;
cout << array->data[10][9] << endl;
delete array;
}
यहां वास्तव में क्या चल रहा है? क्या यह स्मृति ढेर, या ढेर पर बनाई गई है? मेरा अनुमान ढेर है, लेकिन यह कैसे काम करता है? क्या संकलक स्मृति के एक बड़े ब्लॉक को आवंटित करता है, और उसके बाद पॉइंटर्स स्टोर करता है जो प्रत्येक n
तत्वों में सूचकांक करता है? या क्या यह स्मृति के कई छोटे ब्लॉक (आवश्यक रूप से संगत नहीं) आवंटित करता है, और प्रत्येक ब्लॉक में स्टोर पॉइंटर्स आवंटित करता है?
इसके अलावा, मैं टेम्पलेट की सहायता के बिना ऐसा नहीं कर सकता। विशेष रूप से, यह कोड संकलित नहीं करता है:
int m = 1000;
const int n = 100;
(float[n])* array = new (float[n])[m];
यहां क्या हो रहा है?
संपादित करें:
वाक्य रचना सुझावों के लिए धन्यवाद, हर कोई। क्या मैं सच में में दिलचस्पी थी क्या ब्लॉक
int m = 1000;
const int n = 100;
float (*array)[n] = new float[m][n];
में क्या होता है, लेकिन मैं कैसे टेम्पलेट्स के उपयोग के बिना यह लिखने के लिए पता नहीं था है। एक चीज जिसमें मुझे वास्तव में दिलचस्पी थी, यदि संकलक ढेर पर एक बड़े ब्लॉक के रूप में आवंटित करता है, तो आप प्रत्येक एन-वें तत्व को पॉइंटर्स संग्रहीत किए बिना किसी विशेष तत्व तक पहुंचने के लिए सिंटैक्स array[i][j]
का उपयोग कैसे कर सकते हैं? तब मुझे एहसास हुआ कि n
स्थिर है, sizeof(float[n])
तय है, इसलिए जब आप सरणी बनाते हैं, तो संकलक m
तत्वों की एक सरणी आवंटित कर रहा है जहां प्रत्येक तत्व float[n]
है, जो मेरे मामले में 100 * 4 = 400
बाइट्स है। नाउ इट आल मेक्स सेंस। धन्यवाद!
आप तीन के नियम का उल्लंघन किया। मैं जानता हूँ कि यह बात करने के लिए संबंधित नहीं है, लेकिन यह देखकर या स्वचालित रूप से एक नाशक परिभाषा टाइपिंग की घंटी चेतावनी अंगूठी है और आप कॉपी करने और काम के बारे में सोचने के लिए प्राप्त करने के लिए एक अच्छी आदत है। (और यदि आप परेशान नहीं करना चाहते हैं, तो उन्हें C++ 03 में निजी घोषित करें या सी ++ 11 में हटा दिया गया है)। – aschepler