2009-04-22 11 views
6

टेम्पलेट मेटाप्रोग्रामिंग का उपयोग रनटाइम के दौरान संकलन समय पर फैक्टरियल जैसी चीजों की गणना के लिए किया जा सकता है। मैंने सुना है कि कुछ प्रोग्रामिंग प्रतियोगिताओं ने टेम्पलेट मेटाप्रोग्रामिंग दुर्व्यवहार को ठीक करने के लिए संकलन समय पर सीमाएं पेश की हैं।टेम्पलेट संकलन वास्तव में कितना समय ले सकता है?

क्या टेम्पलेट्स का उपयोग करने का कोई निर्दोष दिखने वाला उदाहरण है जो संकलन के लिए वास्तव में बहुत लंबा समय (कई घंटों) लेता है?

उत्तर

3

मैंने सुना है कि अंतर्राष्ट्रीय ओलंपियाड इनफॉरमैटिक्स (एक ऐसी प्रोग्रामिंग प्रतियोगिता) ने पहली बार प्रतिस्पर्धा करने के बाद संकलन समय सीमाएं पेश कीं, एक प्रतियोगी ने this जैसी तकनीक का उपयोग करके 7 आयामी वेक्टर बनाया। उसका कोड रात भर संकलित करना पड़ा था, यह इतना बुरा था। मुझे लगता है कि यह 90 के उत्तरार्ध में कुछ समय हुआ।

5

टेम्पलेट तंत्र ट्यूरिंग-पूर्ण है। इसका मतलब यह है कि कम से कम सिद्धांत में, किसी भी गणना को किया जा सकता है जिसे इस तरह संकलित समय पर किया जा सकता है (अभ्यास में आप टेम्पलेट गहराई आदि पर काफी तेजी से चल सकते हैं लेकिन यह संकलक निर्भर है)।

चाहे आप ऐसा करना चाहते हैं या नहीं, यह एक अलग सवाल है। आप एक महंगा एल्गोरिदम का उपयोग कर "संकलन के लिए घंटों" के अपने मानदंड से तुच्छ रूप से मिलान कर सकते हैं। लेकिन this one implementing an FFT जैसे अधिक व्यावहारिक कोड भी हैं; देना एक बड़ा पर्याप्त डेटा सेट है कि और यह कुछ समय ले जाएगा ...

+0

यह एन = 1000 के साथ Core2 जोड़ी 2,66 पर के बारे में 25 सेकंड लेता है। यह प्रभावशाली है लेकिन बहुत लंबा नहीं है। और यह कोड निश्चित रूप से निर्दोष रूप से नहीं देख रहा है। – sharptooth

+0

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

3

प्रयास करें इस

template <int M, int N> 
struct Ack 
{ 
    enum { value = Ack<M - 1, Ack<M, N - 1>::value >::value }; 
}; 

template <int M> 
struct Ack<M, 0> 
{ 
    enum { value = Ack<M - 1, 0>::value }; 
}; 

template <> 
struct Ack<0, 0> 
{ 
    enum { value = 1 }; 
}; 

template <int N> 
struct Ack<0, N> 
{ 
    enum { value = N + 1 }; 
}; 

void main() 
{ 
    printf("Result: %d\n", Ack<150, 150>::value); 
} 

यह शायद horribble लगता है (मैं दृश्य स्टूडियो 2005 प्रयुक्त), मैं सिर्फ यह करने के लिए एक बराबर लिखने का प्रयास किया प्यारा तुतलाना समारोह

(defun ack(m, n) 
cond ((= m 0) (+ n 1)) 
    ((= n 0) ack(- m 1) n) 
    (t (ack (- m 1) (ack m (-n 1)))) 
) 

हमारे शिक्षक यह कहा Ferma में समारोह है, लेकिन मुझे यकीन नहीं कर रहा हूँ ...

+2

http://en.wikipedia.org/wiki/Ackermann_function –

+2

कोर 2 डुओ 2,66 पर वीसी 7 पर <116, 116> के साथ इसका प्रयास किया - लगभग 20 सेकंड लगते हैं जो प्रभावशाली है लेकिन बहुत लंबा नहीं । बड़े मान संकलन-समय त्रुटि का कारण बनते हैं। – sharptooth

+0

यदि यह एक अर्कर्मन फ़ंक्शन है, तो <5,5> के साथ प्रयास करने से आपको सही परिणाम प्राप्त करने से पहले अपने कंप्यूटर को विस्फोट कर देना चाहिए! यदि आप <116,116> प्राप्त करते हैं तो कुछ गलत है। – CygnusX1

संबंधित मुद्दे