यह पूरी तरह से संभव है कि ईजिन सिर्फ एक बहुत ही लिखित पुस्तकालय (या केवल खराब विचार-विमर्श) है; सिर्फ इसलिए कि कुछ ऑनलाइन है, यह सच नहीं बनाता है। उदाहरण के लिए:
मूल्य से ऑब्जेक्ट पास करना सी ++ में हमेशा एक बहुत बुरा विचार है, क्योंकि इसका मतलब बेकार प्रतियां है, और किसी को संदर्भ के अनुसार उन्हें पास करना चाहिए।
ऑब्जेक्ट के आधार पर यह सामान्य में अच्छी सलाह नहीं है। कभी-कभी यह आवश्यक पूर्व-सी ++ 11 होता है (क्योंकि आप किसी ऑब्जेक्ट को अवांछित होना चाहते हैं), लेकिन सी ++ 11 में, यह आवश्यक नहीं है। आप अभी भी ऐसा कर सकते हैं, लेकिन यह संदर्भ द्वारा मूल्य को हमेशा पास करने के लिए आवश्यक कभी नहीं है। यदि आप आवंटित स्मृति या कुछ शामिल करते हैं तो आप इसे केवल मूल्य से स्थानांतरित कर सकते हैं। जाहिर है, अगर यह एक "देखो-लेकिन-डॉन-टच" चीज की तरह है, तो const&
ठीक है।
संभवतः ईजिन के Vector2d
की तरह सरल संरचना ऑब्जेक्ट्स शायद कॉपी करने के लिए पर्याप्त सस्ते हैं (विशेष रूप से x86-64 में, जहां पॉइंटर्स 64-बिट हैं) कि प्रतिलिपि प्रदर्शन के संदर्भ में अधिक नहीं होगी। उसी समय, यह ओवरहेड (सैद्धांतिक रूप से) है, इसलिए यदि आप प्रदर्शन महत्वपूर्ण कोड में हैं, तो यह मदद कर सकता है।
फिर फिर, यह नहीं हो सकता है।
ईगिन के बारे में बात करने वाले विशेष क्रैश मुद्दे को ऑब्जेक्ट्स के संरेखण के साथ करना है। हालांकि, अधिकांश सी ++ 03 कंपाइलर-विशिष्ट संरेखण समर्थन गारंटी देता है कि सभी मामलों में संरेखण। तो ऐसा कोई कारण नहीं है कि "अपना प्रोग्राम क्रैश करें!"। मैंने कभी एक एसएसई/अल्टावैक/आदि-आधारित लाइब्रेरी नहीं देखी है जो संकलक-विशिष्ट संरेखण घोषणाओं का उपयोग करती है जो मूल्य मानकों के साथ क्रैश का कारण बनती हैं। और मैंने काफी कुछ उपयोग किया है।
तो अगर उन्हें इस तरह की किसी प्रकार की दुर्घटना समस्या हो रही है, तो मैं ईजिन को संदेह योग्य मानता हूं। आगे की जांच के बिना नहीं।
इसके अलावा, यदि कोई ऑब्जेक्ट मूल्य से गुजरने के लिए असुरक्षित है, जैसे कि ईजिन दस्तावेज़ सुझाव देते हैं, तो इसे संभालने का उचित तरीका ऑब्जेक्ट को गैर-प्रति-निर्माण योग्य बनाना होगा। कॉपी असाइनमेंट ठीक होगा, क्योंकि इसे पहले से मौजूद ऑब्जेक्ट की आवश्यकता है। हालांकि, ईजिन ऐसा नहीं करता है, जो फिर से सुझाव देता है कि डेवलपर्स ने एपीआई डिज़ाइन के कुछ बेहतर बिंदुओं को याद किया।
हालांकि, रिकॉर्ड के लिए, सी ++ 11 में alignas
कीवर्ड है, जो यह घोषित करने का एक मानक तरीका है कि कोई ऑब्जेक्ट एक निश्चित संरेखण का होगा।
इसके अलावा, ऐसी वस्तुओं को मूल्य से वापस करने में कोई समस्या क्यों नहीं है?
कौन कहता है कि (प्रतिलिपि समस्या को ध्यान में रखते हुए, संरेखण समस्या नहीं है)? अंतर यह है कि आप संदर्भ द्वारा एक अस्थायी मूल्य वापस नहीं कर सकते हैं। तो वे ऐसा नहीं कर रहे हैं क्योंकि यह संभव नहीं है।
क्या आपने ['std :: aligned_storage <>'] (http://en.cppreference.com/w/cpp/types/aligned_storage) देखा है? – ildjarn
मैंने कभी ऐसी वस्तु के बारे में नहीं सुना है जिसे मूल्य से पारित नहीं किया जा सकता है, और इस तरह की वस्तु को खराब तरीके से डिजाइन किया जाएगा। मुझे आश्चर्य है कि इगिन ने ऐसा क्यों किया? –
@ildjarn: अब मेरे पास है :) क्या आप समझा सकते हैं कि यह किसी प्रकार के मूल्य से गुजरने को कैसे प्रभावित करता है? –