2012-04-04 13 views
16

ईजिन पुस्तकालय प्रलेखन पढ़ना, मैंने देखा कि some objects cannot be passed by value। क्या सी ++ 11 या योजनाबद्ध विकास में कोई विकास है जो इस तरह की वस्तुओं को मूल्य से पारित करने के लिए सुरक्षित बनाएगा?सी ++ संरेखण का भविष्य: मूल्य से गुजर रहा है?

इसके अलावा, मूल्यों से ऐसी वस्तुओं को वापस करने में कोई समस्या क्यों नहीं है?

+6

क्या आपने ['std :: aligned_storage <>'] (http://en.cppreference.com/w/cpp/types/aligned_storage) देखा है? – ildjarn

+2

मैंने कभी ऐसी वस्तु के बारे में नहीं सुना है जिसे मूल्य से पारित नहीं किया जा सकता है, और इस तरह की वस्तु को खराब तरीके से डिजाइन किया जाएगा। मुझे आश्चर्य है कि इगिन ने ऐसा क्यों किया? –

+0

@ildjarn: अब मेरे पास है :) क्या आप समझा सकते हैं कि यह किसी प्रकार के मूल्य से गुजरने को कैसे प्रभावित करता है? –

उत्तर

9

वे में सी ++ 11 ऐसा कर सकता है:

class alignas(16) Matrix4f 
{ 
    // ... 
}; 

अब वर्ग हमेशा एक 16-बाइट सीमा पर गठबंधन की जाएगी।

इसके अलावा, शायद मैं मूर्खतापूर्ण हूं लेकिन यह किसी भी तरह का मुद्दा नहीं होना चाहिए। इस तरह एक वर्ग को देखते हुए:

class Matrix4f 
{ 
public: 
    // ... 
private: 
    // their data type (aligned however they decided in that library): 
    aligned_data_type data; 

    // or in C++11 
    alignas(16) float data[16]; 
}; 

संकलनकर्ता अब वैसे भी एक 16-बाइट सीमा पर एक Matrix4f आवंटित करने के लिए है, क्योंकि यह है कि यह टूट जाएगा बाध्य कर रहे हैं; कक्षा-स्तर alignas अनावश्यक होना चाहिए। लेकिन मुझे किसी भी तरह अतीत में गलत माना जाता है।

+0

बेशक, आपको 16-बाइट गठबंधन स्टैक्स की भी आवश्यकता है ... मुझे लगता है कि कुछ लोकप्रिय कंपाइलर स्थानीय चर और तर्कों के लिए संरेखण आवश्यकताओं का सम्मान नहीं करते हैं जब तक आप स्टैक संरेखण को कॉन्फ़िगर नहीं करते हैं। –

+3

@BenVoigt: आह। :/ठीक है, कम से कम 'alignas' के साथ वे संकलक को एक त्रुटि थूकने की आवश्यकता है, "क्षमा करें, मैं ऐसा नहीं कर सकता।" (Ergo, वास्तव में आवश्यक होने पर संदर्भ द्वारा गुजरने के लिए मजबूर होना।) – GManNickG

+0

@BenVoigt: यदि ऐसा है, तो आप कभी भी एसएसई या स्टैक पर ऐसी अन्य चीजों के लिए कंपाइलर इंट्रिनिक्स (विशेष कंपाइलर कॉन्फ़िगरेशन के बिना) नहीं डाल सकते, क्योंकि उन्हें 16-बाइट की आवश्यकता होती है संरेखण। –

16

यह पूरी तरह से संभव है कि ईजिन सिर्फ एक बहुत ही लिखित पुस्तकालय (या केवल खराब विचार-विमर्श) है; सिर्फ इसलिए कि कुछ ऑनलाइन है, यह सच नहीं बनाता है। उदाहरण के लिए:

मूल्य से ऑब्जेक्ट पास करना सी ++ में हमेशा एक बहुत बुरा विचार है, क्योंकि इसका मतलब बेकार प्रतियां है, और किसी को संदर्भ के अनुसार उन्हें पास करना चाहिए।

ऑब्जेक्ट के आधार पर यह सामान्य में अच्छी सलाह नहीं है। कभी-कभी यह आवश्यक पूर्व-सी ++ 11 होता है (क्योंकि आप किसी ऑब्जेक्ट को अवांछित होना चाहते हैं), लेकिन सी ++ 11 में, यह आवश्यक नहीं है। आप अभी भी ऐसा कर सकते हैं, लेकिन यह संदर्भ द्वारा मूल्य को हमेशा पास करने के लिए आवश्यक कभी नहीं है। यदि आप आवंटित स्मृति या कुछ शामिल करते हैं तो आप इसे केवल मूल्य से स्थानांतरित कर सकते हैं। जाहिर है, अगर यह एक "देखो-लेकिन-डॉन-टच" चीज की तरह है, तो const& ठीक है।

संभवतः ईजिन के Vector2d की तरह सरल संरचना ऑब्जेक्ट्स शायद कॉपी करने के लिए पर्याप्त सस्ते हैं (विशेष रूप से x86-64 में, जहां पॉइंटर्स 64-बिट हैं) कि प्रतिलिपि प्रदर्शन के संदर्भ में अधिक नहीं होगी। उसी समय, यह ओवरहेड (सैद्धांतिक रूप से) है, इसलिए यदि आप प्रदर्शन महत्वपूर्ण कोड में हैं, तो यह मदद कर सकता है।

फिर फिर, यह नहीं हो सकता है।

ईगिन के बारे में बात करने वाले विशेष क्रैश मुद्दे को ऑब्जेक्ट्स के संरेखण के साथ करना है। हालांकि, अधिकांश सी ++ 03 कंपाइलर-विशिष्ट संरेखण समर्थन गारंटी देता है कि सभी मामलों में संरेखण। तो ऐसा कोई कारण नहीं है कि "अपना प्रोग्राम क्रैश करें!"। मैंने कभी एक एसएसई/अल्टावैक/आदि-आधारित लाइब्रेरी नहीं देखी है जो संकलक-विशिष्ट संरेखण घोषणाओं का उपयोग करती है जो मूल्य मानकों के साथ क्रैश का कारण बनती हैं। और मैंने काफी कुछ उपयोग किया है।

तो अगर उन्हें इस तरह की किसी प्रकार की दुर्घटना समस्या हो रही है, तो मैं ईजिन को संदेह योग्य मानता हूं। आगे की जांच के बिना नहीं।

इसके अलावा, यदि कोई ऑब्जेक्ट मूल्य से गुजरने के लिए असुरक्षित है, जैसे कि ईजिन दस्तावेज़ सुझाव देते हैं, तो इसे संभालने का उचित तरीका ऑब्जेक्ट को गैर-प्रति-निर्माण योग्य बनाना होगा। कॉपी असाइनमेंट ठीक होगा, क्योंकि इसे पहले से मौजूद ऑब्जेक्ट की आवश्यकता है। हालांकि, ईजिन ऐसा नहीं करता है, जो फिर से सुझाव देता है कि डेवलपर्स ने एपीआई डिज़ाइन के कुछ बेहतर बिंदुओं को याद किया।

हालांकि, रिकॉर्ड के लिए, सी ++ 11 में alignas कीवर्ड है, जो यह घोषित करने का एक मानक तरीका है कि कोई ऑब्जेक्ट एक निश्चित संरेखण का होगा।

इसके अलावा, ऐसी वस्तुओं को मूल्य से वापस करने में कोई समस्या क्यों नहीं है?

कौन कहता है कि (प्रतिलिपि समस्या को ध्यान में रखते हुए, संरेखण समस्या नहीं है)? अंतर यह है कि आप संदर्भ द्वारा एक अस्थायी मूल्य वापस नहीं कर सकते हैं। तो वे ऐसा नहीं कर रहे हैं क्योंकि यह संभव नहीं है।

+0

आपके उत्तर के लिए धन्यवाद (+1) - आपके प्रश्न के उत्तर में "कौन कहता है कि नहीं है?" मैं केवल लिंक किए गए दस्तावेज के नीचे उद्धृत कर रहा था। वे कहते हैं कि नहीं है। –

+2

@NeilG: मुझे लगता है कि वस्तुओं को मूल्य से वापस करने में कोई समस्या नहीं है, क्योंकि अस्थायी (जिसे असाइन किया जा सकता है या यहां तक ​​कि अस्तित्व में भी नहीं हो सकता है) का उपयोग नहीं किया जा सकता है।मूल्यों को पहले और बाद में दोनों के साथ ठीक से गठबंधन किया जाता है, इससे कोई फर्क नहीं पड़ता कि (या अगर) अस्थायी है। –

+0

@MooingDuck: धन्यवाद, जो मेरे प्रश्न के वापसी-मूल्य भाग का उत्तर देता है। –

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