कुछ हद तक आश्चर्यजनक रूप से (मेरे लिए), निम्नलिखित दो कार्यक्रमों में काफी बेहतर प्रदर्शन होने बाद से एक के साथ, अलग आउटपुट से संकलन (जीसीसी और बजना के साथ परीक्षण):स्वचालित XValue अनुकूलन
#include <vector>
int main()
{
std::vector<int> a(2<<20);
for(std::size_t i = 0; i != 1000; ++i) {
std::vector<int> b(2<<20);
a = b;
}
}
बनाम
#include <vector>
int main()
{
std::vector<int> a(2<<20);
for(std::size_t i = 0; i != 1000; ++i) {
std::vector<int> b(2<<20);
a = std::move(b);
}
}
क्या कोई मुझे बता सकता है कि कंपाइलर स्वचालित रूप से b
को अंतिम असाइनमेंट में एक xvalue क्यों नहीं मानता है और स्पष्ट std::move
कास्ट के बिना चाल semantics लागू करते हैं?
संपादित: (g++|clang++) -std=c++11 -O3 -o test test.cpp
आप संकलक के पास क्या पैरामीटर पारित कर रहे हैं? – Joe
मेरा पहला अनुमान यह है कि यह एक अप्रत्याशित तरीके से एक प्रतिलिपि में बदलाव को बदलने के कार्यक्रम के अर्थशास्त्र को बदल देगा। – pmr
@pmr: मुझे यही संदेह है, लेकिन मैं वास्तव में समझना चाहता हूं क्यों। नैतिक रूप से, ऐसा लगता है कि मेरे लिए एक xvalue क्या होना चाहिए। – Xoph