से एक नकली ढेर तेज है मैं कुछ रिकर्सिव पार्सिंग कर रहा हूं।एक असली स्टैक
वर्तमान में मेरे पास एक नकली स्टैक है, जहां मैं अपनी परिमित राज्य मशीन के लिए राज्यों को संग्रहीत करता हूं, इसलिए जब मैं बार-बार ड्रिल करता हूं तो मैं उस राज्य को धक्का देता हूं जिसमें मैं अंदर था, और पाठ के रिकर्सिव बिट को संसाधित करने के बाद इसे पॉप करता हूं ।
यह एक 'राज्य आईडी' ढेर की तरह है करने के लिए तेजी से होगा:
int* stack = 0
int top = 0;
// ...
// drill down bit
if (stack == 0)
stack = (int*)malloc(STACK_JUMP_SIZE);
else if (top % STACK_JUMP_SIZE == 0)
stack = (int*)realloc(stack, (top+STACK_JUMP_SIZE) * sizeof(int));
stack[top++] = currentState;
// ...
// pop up later
{currentState = stack[--top]; {
if (top == 0) {
free(stack);
stack = 0;
} else if ((top+1) % STACK_JUMP_SIZE == 0) {
stack = (int*)realloc(stack, (top+1)*sizeof(int));
}
या यह ऊपर उचित कार्यों में बात विभाजित है और सी ढेर के बारे में चिंता ++ जाने के लिए तेजी से होगा।
(मुझे पता है कि कोई मुझे बताएगा कि यह सी है, यह सी ++ नहीं है, इसलिए मैं पूर्व में स्पष्ट रूप से उत्तर देता हूं, मेरे प्रोग्राम के सी ++ लेकिन इसमें बहुत सी सी है)।
मैं व्यक्तिगत रूप से अपेक्षा करता हूं कि सामान्य कार्य तेजी से होंगे .. लेकिन किसी ने मुझे बहुत सोचा है कि यह नकली ढेर चीज तेज है। अब मैं उन लोगों से अधिक राय देखना चाहता हूं जो मुझसे ज्यादा चीजें हैं :) – matiu
@matu यह मशीन पर निर्भर करता है। स्पार्क पर, फ़ंक्शन कॉल को शून्य मेमोरी एक्सेस की आवश्यकता होती है, और यह काफी तेज हो सकती है। इंटेल पर, आप मेमोरी में रिटर्न एड्रेस और फ्रेम पॉइंटर को सहेजते हैं, साथ ही फंक्शन के लिए किसी भी तर्क की आवश्यकता होती है: यह बहुत महंगा हो सकता है। –