今晚我一直在看一些我过去几天一直在处理的代码,并开始阅读移动语义,特别是 std::move。我有几个问题要问你们专业人士,以确保我走在正确的道路上,而不是做出任何愚蠢的假设!
首先:
1)最初,我的代码有一个返回大向量的函数:
template<class T> class MyObject
{
public:
std::vector<T> doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(theVector);
}; // eo doSomething
}; // eo class MyObject
鉴于“theVector”在此是临时的并且“丢弃”,我将函数修改为:
std::vector<T>&& doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(static_cast<std::vector<T>&&>(theVector));
}; // eo doSomething
这个对吗?这样做有什么陷阱吗?
2)我注意到我有一个函数返回std::string
它自动调用移动构造函数。调试到返回字符串(谢谢,Aragorn),我注意到它称为显式移动构造函数。为什么有一个字符串类而不是向量?
我无需对此函数进行任何修改即可利用移动语义:
// below, no need for std::string&& return value?
std::string AnyConverter::toString(const boost::any& _val) const
{
string ret;
// convert here
return(ret); // No need for static_cast<std::string&&> ?
}; // eo toString
3)最后,我想做一些性能测试,是因为 std::move 语义而得到的惊人的快速结果还是我的编译器(VS2010)也做了一些优化?
(_getMilliseconds()
为简洁起见省略的实现)
std::vector<int> v;
for(int a(0); a < 1000000; ++a)
v.push_back(a);
std::vector<int> x;
for(int a(0); a < 1000000; ++a)
x.push_back(a);
int s1 = _getMilliseconds();
std::vector<int> v2 = v;
int s2 = _getMilliseconds();
std::vector<int> v3 = std::move(x);
int s3 = _getMilliseconds();
int result1 = s2 - s1;
int result2 = s3 - s2;
结果显然很棒。result1 是一个标准作业,耗时 630 毫秒。第二个结果是 0ms。这是对这些东西的良好性能测试吗?
我知道其中一些对你们很多人来说是显而易见的,但我想确保在我对我的代码进行更深入的研究之前了解语义。
提前致谢!