2012-01-18 12 views
6

मैंने जीसीसी एसटीएल (4.6.1) में देखा और देखा कि std::copy() बिल्टिन __is_trivial()true का मूल्यांकन करने के मामले में एक अनुकूलित संस्करण का उपयोग करता है।std :: कॉपी/memcpy/memmove अनुकूलन

चूंकि std::copy() और std::reverse_copy() टेम्पलेट सरणी में तत्वों की प्रतिलिपि बनाने के लिए बहुत उपयोगी हैं, इसलिए मैं उनका उपयोग करना चाहता हूं। हालांकि, मेरे पास कुछ प्रकार हैं (जो टेम्पलेट इंस्टॉलेशन के परिणाम हैं) जो ऐसे structs हैं जिनमें कुछ मामूली मान होते हैं, कोई पॉइंटर्स नहीं होते हैं और कोई कॉपी कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर नहीं होता है।

क्या G ++ पर्याप्त समझने के लिए पर्याप्त है कि वास्तव में मेरा प्रकार छोटा है? क्या यह सुनिश्चित करने के लिए सी ++ 98 में कोई तरीका है कि एक एसटीएल कार्यान्वयन जानता है कि मेरा प्रकार छोटा है?

मुझे लगता है कि सी ++ 11 में, is_trivial<> टाइप विशेषता का उपयोग करके चीजें सुविधाजनक हो जाएंगी। क्या यह सही है?

धन्यवाद!

संपादित करें: इस के साथ बहुत देर हो चुकी है, लेकिन यहां एक बहुत ही सरल Type कक्षा का उदाहरण है जो जीसीसी और एलवीएम के लिए तुच्छ नहीं है। कोई विचार?

#include <iostream> 

struct Spec; 

template <typename TValue, typename TSpec> 
class Type 
{ 
public: 
    TValue value; 

    Type() : value(0) {} 
}; 

int main() 
{ 
    std::cerr << "__is_trivial(...) == " 
       << __is_trivial(Type<char, Spec>) << '\n';                                                          
    return 0; 
} 
+3

सी ++ 03 पीओडी डिफ़ॉल्ट डिज़ाइनर को भी डिबिट करता है अगर मुझे याद है, जो संभवतः छोटा होने से रोकता है। –

+0

@MooingDuck: धन्यवाद, मुझे लगता है कि यह स्पष्टीकरण है। मैथ्यू के जवाब के साथ, यह मेरे प्रश्न का उत्तर देता है। – Manuel

उत्तर

5

trivial पर कुछ बहस हुई है।

उदाहरण के लिए, जहां तक ​​मैं बता सकता हूं कि आपका उदाहरण तुच्छ रूप से रचनात्मक नहीं है (std::is_trivially_default_constructible मुझे लगता है कि झूठी वापसी होगी)।

आपके मामले में, मुझे लगता है कि आपको नई विशेषता std::is_trivially_copyable की आवश्यकता होगी, जो अधिक बढ़िया है। तो ... अपने कंपाइलर को अपग्रेड करें?

4

__is_trivial सभी प्रकार के लिए सही मूल्य देता है।

आप इसका उपयोग करने के लिए किसी भी पेटिकुलर एसटीएल कार्यान्वयन पर भरोसा नहीं कर सकते हैं, हालांकि यदि संकलक विक्रेता ने इसे आपूर्ति की है तो संभवतः इसमें दृश्यों के पीछे विभिन्न कंपाइलर-विशिष्ट सुधार शामिल हैं।

सी ++ 11 का std::is_trivial केवल इस सुविधा को मानकीकृत कर रहा है, इसका उपयोग करने के लिए कार्यान्वयन का कोई कारण नहीं है।

+0

जाहिर है, '__is_trivial' यह नहीं समझ सकता कि कोई प्रकार छोटा रूप से कॉपी करने योग्य है या नहीं। :(मेरे अपडेट में उदाहरण देखें। – Manuel

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