2013-05-17 6 views
5

मेरी कक्षाओं में मैं std::vector आदि का उपयोग सदस्य चर के रूप में करता हूं, जो अपने स्वयं के चालकों के साथ आते हैं। मैं स्पष्ट रूप से अपनी कक्षाओं के लिए चालकों को घोषित नहीं करता हूं और उन्हें अधिकांश भाग के लिए निहित रूप से घोषित नहीं किया जाता है।क्या अस्थायी वस्तुओं में सदस्य चर संभवतः स्थानांतरित हो जाते हैं?

यदि निहित प्रतिलिपि निर्माता या मेरी कक्षा के निहित असाइनमेंट ऑपरेटर को रावल्यू कहा जाता है, तो वे सदस्य हैं जिन्होंने रचनाकारों को कॉपी या स्थानांतरित किया है?

यदि वे स्थानांतरित हो जाते हैं, तो क्या रचनात्मक सदस्यों के साथ कक्षाओं का उपयोग करते समय अस्थायी से बचने का प्रयास करने का कोई कारण है?

+0

यदि सी ++ 11 का उपयोग करना है तो उन्हें स्थानांतरित किया जाएगा, यदि सी ++ 03 की प्रतिलिपि बनाई जाएगी। सी ++ 11 से सभी मानक लाइब्रेरी कंटेनर कक्षाएं स्थान अर्थशास्त्र का लाभ उठाएंगी। –

+0

लेकिन अगर मैं स्पष्ट रूप से एक कॉपी कन्स्ट्रक्टर घोषित करता हूं तो यह मामला नहीं होगा? जहां तक ​​मुझे पता है, एक रैल्यू के लिए एक कॉन्स्ट संदर्भ को जोड़ना और फिर सामग्री को असाइन करना सदस्यों के चाल असाइनमेंट ऑपरेटरों को उपयोग करने की अनुमति नहीं देगा। – gokturk

+0

_ "उन्हें अधिकतर भाग के लिए निहित रूप से घोषित नहीं किया गया है।" _ तो आपके प्रकार में सैमसंगिक्स नहीं चलते हैं, इसलिए सदस्यों को –

उत्तर

0

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

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

4

यदि आपकी कक्षा स्पष्ट रूप से एक चालक कन्स्ट्रक्टर/असाइनमेंट ऑपरेटर घोषित नहीं करती है और उन्हें स्पष्ट रूप से घोषित नहीं किया जाता है, तो निहित रूप से घोषित प्रतिलिपि ctor/असाइनमेंट-ऑप सदस्यों को स्थानांतरित नहीं करेगा, बल्कि उन्हें कॉपी करेगा।

यदि स्थानांतरित हो जाता है तो उन्हें स्थानांतरित किया जाएगा यदि आपके वर्ग के लिए सीटीओ/असाइनमेंट-ऑप को स्पष्ट रूप से घोषित किया गया था। आप कहते हैं कि वे नहीं हैं - वह क्यों है? क्या आपके वर्गों में कस्टम विनाशक हैं? आपको ऐसे डिज़ाइन के लिए प्रयास करना चाहिए जहां आपको कस्टम डॉटर की प्रतिलिपि नहीं है, प्रतिलिपि/स्थानांतरित करें और कॉपी/चाल असाइनमेंट ओप - कभी-कभी "शून्य का नियम" कहा जाता है।

यदि आपको कस्टम ड्यूटी की आवश्यकता है, तो आपको चाल semtics का उपयोग करने के लिए स्पष्ट रूप से move ctor/असाइनमेंट-सेशन घोषित करना चाहिए। यदि आपका कंपाइलर इसका समर्थन करता है, तो आप उन्हें डिफॉल्ट के रूप में घोषित कर सकते हैं।

+0

स्थानांतरित करने का कोई तरीका नहीं है "यदि आपका कंपाइलर इसका समर्थन करता है, तो आप उन्हें डिफ़ॉल्ट रूप से घोषित कर सकते हैं। " क्या ज्यादातर मामलों में यह बुरा विचार नहीं है (पांच का शासन)? – dyp

+0

"आप कहते हैं कि वे नहीं हैं - वह क्यों है?" हां, अधिकांश में विनाशक हैं। – gokturk

+1

@DyP प्रश्न में कक्षा में कॉपी सीटीर्स को स्पष्ट रूप से परिभाषित किया गया है, इसलिए यह पहले से ही टूटा हुआ है, या डीटीओ केवल ऐसी चीजें करता है जो किसी डिफ़ॉल्ट लॉग को प्रभावित नहीं करेंगे - जैसे कुछ लॉगिंग करना। – Angew

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