में रैल्यू पर बहुत सारी प्रतियां उत्पन्न करते हैं। मैं लिनक्स & विंडोज दोनों के लिए एक ऐप लिख रहा हूं, और ध्यान दिया कि जीसीसी बिल्ड कॉपी कन्स्ट्रक्टर को बहुत बेकार कॉल का उत्पादन कर रहा है।मानक लाइब्रेरी कंटेनर जीसीसी
struct A
{
A() { std::cout << "default" << std::endl; }
A(A&& rvalue) { std::cout << "move" << std::endl; }
A(const A& lvalue) { std::cout << "copy" << std::endl; }
A& operator =(A a) { std::cout << "assign" << std::endl; return *this; }
};
BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
std::vector<A> vec_a(3);
}
इस परीक्षा सिर्फ 3 तत्वों का एक वेक्टर बनाता है:
यहाँ इस व्यवहार का निर्माण करने के लिए एक उदाहरण कोड है। मैं 3 डिफ़ॉल्ट कन्स्ट्रक्टर कॉल और 0 प्रतियों की अपेक्षा करता हूं क्योंकि A
लाइवल्स नहीं हैं।
विजुअल C++ 2010 में, उत्पादन होता है:
default
move
default
move
default
move
जीसीसी 4.4.0 (MinGW) में, (-O2 -std = C++ 0x), उत्पादन होता है:
default
copy
copy
copy
क्या चल रहा है और मैं इसे कैसे ठीक कर सकता हूं? वास्तविक वर्ग के लिए प्रतियां महंगा हैं, डिफ़ॉल्ट निर्माण और चाल सस्ते हैं।
क्या आपने '' हेडर देखा है? कन्स्ट्रक्टर क्या कर रहा है? जीसीसी व्यवहार सी ++ 03 spec के साथ संगत है, जहां एक ऑब्जेक्ट डिफॉल्ट बनाया गया है, फिर एन बार कॉपी किया गया है। यह संभव है कि मानक लाइब्रेरी का आपका संस्करण C++ 0x में जोड़े गए नए कन्स्ट्रक्टर का समर्थन नहीं करता है, जो डिफ़ॉल्ट रूप से एन तत्वों का निर्माण करता है। –
क्योंकि उदाहरण सी ++ 0x भाषा सुविधाओं का उपयोग करता है, मुझे लगता है कि यह C++ 0x spec के बारे में एक प्रश्न है, सी ++ 03 spec नहीं। –
जीसीसी 4.5 – tstenner