2012-05-23 23 views
17

के लाभों को समझना मैंने सी ++ 11 में चाल semantics के बारे में कुछ विवरण पढ़ा है और मुझे आश्चर्य है कि इसका क्या उपयोग किया जा सकता है। वर्तमान में, कई सी ++ गणित पुस्तकालय मूल्यांकन में देरी के लिए टेम्पलेट मेटाप्रोग्रामिंग का उपयोग करते हैं।चाल semantics बनाम टेम्पलेट मेटाप्रोग्रामिंग

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

यदि नहीं, तो किस संदर्भ में अर्थशास्त्र का उपयोग किया जाता है। यदि हां, तो उस तरह के उपयोग के लिए टेम्पलेट मेटाप्रोग्रामिंग की तुलना में अंतर/सीमाएं क्या हैं?

+4

मेटाप्रोग्रामिंग मूल्यांकन में देरी के विपरीत काफी विपरीत है। एक दिलचस्प सवाल है, लेकिन आपके विचारों का एक नमूना उपयोगी होगा। –

+0

मुझे लगता है कि दोनों दृष्टिकोणों के बीच का अंतर बड़ा नहीं होगा, लेकिन मुझे लगता है कि रैवलू संदर्भ पुस्तकालय को थोड़ा आसान और क्लीनर बना देगा।

+3

@MooingDuck: अभिव्यक्ति टेम्पलेट कभी-कभी प्रतियों को समाप्त करने से अधिक सक्षम बनाता है। उदाहरण के लिए 'ए * बी + सी' अभिव्यक्ति में, अभिव्यक्ति टेम्पलेट एफएमए निर्देशों को लागू करके गणना को अनुकूलित कर सकता है, आदि –

उत्तर

13

मैं इन अनुकूलन पर कोई विशेषज्ञ नहीं हूं, लेकिन जैसा कि मैं इसे समझता हूं कि आप अपने मैट्रिक्स प्रकार पर अंकगणितीय ऑपरेटरों को परिभाषित करके काम के बारे में बात कर रहे हैं, उदाहरण के लिए A+B+C*D मैट्रिक्स वापस नहीं करता है, यह एक प्रॉक्सी ऑब्जेक्ट देता है जो को मैट्रिक्स में परिवर्तित कर सकता है। ऐसा तब होता है जब इसे M पर असाइन किया जाता है, और रूपांतरण कोड परिणाम मैट्रिक्स के प्रत्येक सेल को सबसे प्रभावी माध्यमों से गणना करेगा, लाइब्रेरी डिज़ाइनर अस्थायी मैट्रिक्स ऑब्जेक्ट से परहेज कर सकते हैं।

तो, मान लीजिए आप से operator+= का उपयोग कर, तो आप इस एक बार सामान्य, सी ++ 03 शैली की नकल इलिजन है की तरह कुछ मिलता था हमेशा की तरह operator+ लागू चालाक अन्य कुछ नहीं किया तो कार्यक्रम M = A + B + C * D;

शामिल में लात मारी:

Matrix tmp1 = C; 
tmp1 *= D; 
Matrix tmp2 = A; 
tmp2 += B; 
tmp2 += tmp1; 
M = tmp2; 

देरी मूल्यांकन के साथ, आप मिल सकता है कुछ अधिक की तरह:

for (int i = 0; i < M.rows; ++i) { 
    for (int j = 0; j < M.cols; ++j) { 
     /* not necessarily the best matrix multiplication, but serves to illustrate */ 
     c_times_d = 0; 
     for (int k = 0; k < C.cols; ++k) { 
      c_times_d += C[i][k] * D[k][j]; 
     } 
     M[i][j] = A[i][j] + B[i][j] + c_times_d; 
    } 
} 

जबकि "कुछ भी चालाक" कोड कुछ अलग अतिरिक्त लूप और बहुत अधिक असाइनमेंट करेगा।

जहां तक ​​मुझे पता है, semantics ले जाएँ इस मामले में ज्यादा मदद नहीं करता है। तुम क्या लिखा है में कुछ भी A, B, C या D से स्थानांतरित करने के लिए हमें की अनुमति देता है, तो हम के बराबर के साथ समाप्त करने के लिए जा रहे हैं:

Matrix tmp1 = C; 
tmp1 *= D; 
Matrix tmp2 = A; 
tmp2 += B; 
tmp2 += std::move(tmp1); 
M = std::move(tmp2); 

तो अर्थ विज्ञान के लिए कदम और कुछ के साथ मदद नहीं की है आखिरी बिट की तुलना में, जहां ऑपरेटरों के रैवल संस्करण नियमित रूप से बेहतर होते हैं। यदि आपने std::move(A) + std::move(B) + std::move(C) * std::move(D) लिखा है, तो हमें और अधिक उपलब्ध है, क्योंकि हमें C या A से कॉपी नहीं करना पड़ेगा, लेकिन मुझे अभी भी नहीं लगता कि परिणाम देरी-मूल्यांकन कोड के जितना अच्छा है।

असल में, ले जाने के अर्थ विज्ञान अनुकूलन के कुछ महत्वपूर्ण भागों में देरी मूल्यांकन द्वारा प्रदान के साथ मदद नहीं है:

1) देरी मूल्यांकन के साथ, मध्यवर्ती परिणाम वास्तव में कभी के रूप में पूरा मैट्रिक्स अस्तित्व के लिए की जरूरत है। Semantics ले जाएँ संकलक को किसी बिंदु पर पूर्ण मैट्रिक्स A+B मेमोरी में सहेजने से नहीं बचाते हैं।

2) देरी से मूल्यांकन के साथ, हम पूरी अभिव्यक्ति की गणना समाप्त करने से पहले M संशोधित करना प्रारंभ कर सकते हैं। अर्थशास्त्र को ले जाएं संकलक को संशोधित करने में मदद नहीं करते हैं: भले ही संकलक संभावित अवसर को खोजने के लिए पर्याप्त स्मार्ट हो, भले ही गैर-अस्थायी में परिवर्तन को अपने सही क्रम में रखा जाना चाहिए यदि अपवाद को फेंकने का कोई खतरा है, क्योंकि यदि A + B + C * D का कोई भी भाग फेंकता है, तो M इसे शुरू होने के बाद छोड़ा जाना चाहिए।

2

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

ले जाएँ अर्थ विज्ञान भी वस्तुओं है कि स्वाभाविक नहीं हैं के लिए महत्वपूर्ण हैं copyable (fstreams की तरह), लेकिन भावना जंगम बनाने के लिए बनाता है।

0

ले जाएं अर्थशास्त्र वस्तुओं के भीतर प्रबंधित संसाधनों पर लागू होता है और अस्थायी वस्तुओं को बनाए जाने पर संसाधनों को अधिग्रहण/रिलीज़ करने से बचने के लिए उपयोग किया जाता है (यानी गतिशील रूप से आवंटित स्मृति एक संसाधन है)।

टेम्पलेट मेटाप्रोग्रामिंग संरचनाओं पर चलती है, जो ढेर पर आवंटित की जाती हैं (क्योंकि इसे ऑपरेटरों के संकलन समय मूल्यांकन की आवश्यकता होती है)। आप ऑपरेशन के लिए रनटाइम गणना से बचने के लिए इसका उपयोग कर सकते हैं जिसे संकलित समय

34

पर गणना की जा सकती है। मुझे विश्वास है कि आप "टेम्पलेट मेटाप्रोग्रामिंग" कह रहे हैं, इसके लिए एक और सटीक शब्द expression templates है।

अपने मैट्रिक्स गतिशील अपने डेटा आवंटित हैं, तो ले जाने के अर्थ विज्ञान मदद कर सकते हैं वस्तु से जो डेटा स्थानांतरित करने के लिए वस्तु (सहित/temporaries से) जैसे एक अभिव्यक्ति के दौरान उत्पन्न:,

M = A + B + C*D 

अभिव्यक्ति टेम्पलेट्स पर दूसरी तरफ, अस्थायी रूप से पूरी तरह से खत्म हो जाएगा।

यदि आपके matrices गतिशील रूप से अपने डेटा आवंटित नहीं करते हैं (उदाहरण के लिए यदि वे निश्चित आकार और छोटे हैं), तो semantics को अपने प्रदर्शन में सहायता नहीं करेगा।

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

सारांश में:

ले जाएँ अर्थ विज्ञान temporaries को खत्म नहीं करता, लेकिन फिर से आवंटन यह करने के बजाय temporaries के बीच गतिशील रूप से आबंटित स्मृति स्थानांतरित करेंगे।

अभिव्यक्ति टेम्पलेट्स अस्थायी को समाप्त करता है।

0

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

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