2013-09-27 17 views
18

मैं सी ++ 11 में बड़े पैमाने पर सॉफ़्टवेयर इंफ्रास्ट्रक्चर पर काम कर रहा हूं जो विविध टेम्पलेट्स का व्यापक उपयोग करता है। मेरा प्रश्न निम्नलिखित है: इस दृष्टिकोण की मापनीयता क्या है? सबसे पहले, तर्कों की संख्या में ऊपरी सीमा है कि विविध टेम्पलेट्स ले सकते हैं? दूसरा, क्या कोड अत्याधुनिक कंपाइलर्स के साथ एक बड़ा मुद्दा है जब कई तर्कों का उपयोग किया जाता है (और, विस्तार से, इन तर्कों के कई संयोजन जो टेम्पलेट किए गए तरीकों के कई अलग-अलग कार्यान्वयन के लिए उत्पन्न होते हैं)?वैरिएडिक टेम्पलेट्स की स्केलेबिलिटी

+10

सैद्धांतिक रूप से कोई सीमा नहीं है, लेकिन जाहिर है, अभ्यास में कुछ सीमा है, कुछ सीमित संसाधन जैसे राम द्वारा निर्धारित। यदि आप उस बिंदु पर पहुंचते हैं जहां वह सीमा महत्वपूर्ण है, तो आपको शायद बड़ी समस्याएं होंगी, इसलिए मैं उस बारे में चिंता नहीं करता। –

+3

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

+12

सी ++ 11 मानक के अनुलग्नक बी (कार्यान्वयन मात्रा), विशेष रूप से * variadic * टेम्पलेट्स के बारे में कुछ भी नहीं कहता है, लेकिन यह कम से कम 256 फ़ंक्शन पैरामीटर और 1024 टेम्पलेट पैरामीटर की सिफारिश करता है। हालांकि, जब आप अपने उलझन वाले नाम बहुत लंबे होते हैं तो आप पहले समस्याओं में भाग ले सकते हैं। – Oberon

उत्तर

10

मैंने सोचा कि मुझे यह पता लगाने के लिए जाना होगा कि मेरे विशेष कंपाइलर (जी ++ 4.8.1 लिनक्स पर) के लिए टेम्पलेट पैरामीटर की संख्या पर कोई सीमा है या नहीं।

template <int I> 
struct this_is_a_ridiculously_long_struct_name_youd_never_use_in_real_life {}; 

template <int Depth, typename... T> 
struct A 
{ 
    using e = this_is_a_ridiculously_long_struct_name_youd_never_use_in_real_life<Depth>; 

    A() {}; 

    A<Depth - 1, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, T...> a; 
}; 

template <typename... T> 
struct A<0, T...> 
{ 
}; 

int main() 
{ 
    A<899> a; 
} 

टेम्पलेट प्रत्यावर्तन गहराई सीमा जी ++ में 900 चूक, इसलिए 899 पैरामीटर आप देखते हैं: मैं निम्नलिखित परीक्षण का मामला हुआ करता था। हास्यास्पद रूप से लंबे संरचना का नाम यह देखने के लिए प्रयोग किया जाता है कि क्या मैं किसी भी प्रतीक उत्पन्न कर सकता हूं जो कि लिंकर को संभालने के लिए बहुत बड़ा था - इस पर एक सेकंड में।

यदि आप परीक्षण मामले में क्या चल रहा है, तो यह नहीं देख सकता है, मूल रूप से A का प्रत्येक तत्कालता एक सदस्य चर बनाता है जो 20 अतिरिक्त टेम्पलेट पैरामीटर जोड़ता है। आंशिक विशेषज्ञता का उपयोग रिकर्सन को रोकने के लिए किया जाता है। अंत में, A<0, ...> कहीं 18000 टेम्पलेट पैरामीटर के क्षेत्र में है।

मुझे जो मिला वह यह था कि जी ++ ने इसे ठीक से संभाला था। इसके बारे में सोचने में काफी समय लगा, और मेमोरी की एक उचित बिट का इस्तेमाल किया, लेकिन मैं इसे टेम्पलेट पैरामीटर की संख्या में वृद्धि करके असफल होने में असमर्थ था। एक बार टेम्पलेट रिकर्सन गहराई पर्याप्त रूप से सेट होने के बाद क्लैंग 3.1 ने बिना किसी समस्या के इसे संभाला (यानी 900)।

इसके अलावा, हालांकि घायल प्रतीक नाम वास्तव में बहुत बड़ा हो जाते, मैं या तो nm या ld उन्हें प्रयोग को तोड़ने में असमर्थ था। (यह ध्यान देने योग्य है कि लिनक्स/इटेनियम मैंगलिंग योजना प्रतिस्थापन का उपयोग करती है ताकि एक ही प्रकार के दोहराए गए टेम्पलेट पैरामीटर पूरे प्रकार के नाम को दोहराए न हों, बल्कि S0, S1 आदि चिह्नित हैं) एक त्वरित Google चालू नहीं लगता है ईएलएफ प्रतीक लंबाई पर कोई सीमा तय करें, लेकिन शायद कोई और जानता है कि ऐसी सीमा मौजूद है या नहीं।

निष्कर्ष में, जी ++ और कम से कम लिनक्स पर क्लैंग के लिए, टेम्पलेट पैरामीटर की संख्या पर कोई व्यावहारिक सीमा प्रतीत नहीं होती है।

कोड ब्लोट के बारे में आपके प्रश्न के दूसरे भाग के रूप में, यह कहना मुश्किल है, विशेष रूप से एक बार संकलक अनुकूलन शामिल हो जाता है। विविध टेम्पलेट्स के साथ रिकर्सन करना आसान है, लेकिन फिर कंपाइलर के मध्यवर्ती प्रकारों से छुटकारा पाने में भी आसान है। मैं केवल इसे देखने और देखने का सुझाव दे सकता हूं।

+0

मैं टेम्पलेट तर्कों का उपयोग कर रहा था (जेनरेट कोड में) ग्राहक पर निर्भर था और इस प्रकार सीमा के बिना था। इस प्रकार मेरा उत्तर बूस्ट :: एमपीएल का उपयोग करने का सुझाव देता है जो इस सीमा से बचाता है। –

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