बजना/libc का उपयोग ++:
#include <chrono>
#include <iostream>
#include <vector>
#if SLOW_DOWN
class MyClass
{
void Swap(MyClass &other)
{
std::swap(other.member, member);
}
public:
MyClass()
: member()
{
}
MyClass(const MyClass &other)
: member(other.member)
{
}
MyClass(MyClass &&other)
: member(std::move(other.member))
{
}
MyClass &operator=(MyClass other)
{
other.Swap(*this);
return *this;
}
private:
int member;
};
#else
class MyClass
{
public:
MyClass()
: member()
{
}
private:
int member;
};
#endif
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::duration<float, std::milli> ms;
auto t0 = Clock::now();
for (int k = 0; k < 100; ++k)
{
std::vector<MyClass> v;
for (int i = 0; i < 1000000; ++i)
v.push_back(MyClass());
}
auto t1 = Clock::now();
std::cout << ms(t1-t0).count() << " ms\n";
}
$ clang++ -stdlib=libc++ -std=c++11 -O3 -DSLOW_DOWN test.cpp
$ a.out
519.736 ms
$ a.out
517.036 ms
$ a.out
524.443 ms
$ clang++ -stdlib=libc++ -std=c++11 -O3 test.cpp
$ a.out
463.968 ms
$ a.out
458.702 ms
$ a.out
464.441 ms
यह इस परीक्षण पर लगभग 12% की गति अंतर तरह दिखता है।
स्पष्टीकरण: इन परिभाषाओं में से एक में एक छोटी प्रतिलिपि निर्माता और कॉपी असाइनमेंट ऑपरेटर है। दूसरा नहीं है। सी ++ 11 में "ट्रिविअल" का वास्तविक अर्थ है। इसका मतलब है कि कार्यान्वयन को आपकी कक्षा की प्रतिलिपि बनाने के लिए memcpy
का उपयोग करने की अनुमति है। या अपनी कक्षा के बड़े सरणी भी कॉपी करने के लिए। तो यदि आप कर सकते हैं तो अपने विशेष सदस्यों को तुच्छ बनाना सबसे अच्छा है। इसका मतलब है कि संकलक उन्हें परिभाषित करने दें। यद्यपि आप चाहें तो भी उन्हें = default
के साथ घोषित कर सकते हैं।
स्रोत
2012-02-22 22:11:51
एक अच्छा [SO सवाल] था (http://stackoverflow.com/questions/9322174/move-assignment-operator-and-if-this-rhs) जिसे आप देखना चाहते हैं। –
यह सवाल बहुत व्यापक है। आपको इसे एक विशिष्ट परिदृश्य में फाड़ना होगा। चूंकि प्रति वर्ग कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर को प्रत्येक वर्ग के लिए "अच्छी तरह से परिभाषित" तरीके से लिखने का कोई नुस्खा नहीं है। आपके प्रश्न के लिए वही। –
यह बहुत व्यापक क्यों है? कॉपी कन्स्ट्रक्टर + असाइनमेंट ऑपरेटर के लिए आम तौर पर स्वीकार्य पैटर्न है, क्यों नहीं कन्स्ट्रक्टर के लिए भी? – moswald