Visual Studio不遵循移动语义

时间:2017-11-07 22:57:24

标签: c++ visual-studio c++11 visual-studio-2015 move-semantics

我在Visual Studio 2015 v4中尝试此代码。

using namespace std;

void * operator new(size_t size) {
    cout << "Creating new " << endl;
    void * p = malloc(size);
    return p;
}


class CTest {
private:
    string a;
    string b;
public:
    CTest( const string &&one , const string && two  ) :a(move(one)), b(move(two)) {}
};


int main() {
    CTest("one", "one" );
    return 0;   
}

此代码输出&#34;创建新&#34;在Visual Studio中4次,这意味着它分配内存4次。但是遵循语义它应该只分配两次(在数据段中创建2个文字,创建一个和两个函数参数= 2个alloc,然后将它们的资源移动到a和b成员变量)

在g ++输出下进行编译&#34;创建新的&#34;两次,应该如此。

我是否需要设置任何设置才能使VS遵循移动语义?据我所知,它应默认支持。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

这里有几个问题:

1)std::move不会移动,特别是如果您经过const &&。查看答案herehere

2)我所知道的每个std::string实现都使用小缓冲区优化。当使用短字符串(例如"one")构建时,这样的实现永远不会分配。

3)允许标准库运行时在静态初始化期间调用operator new,例如设置std::cout。您看到的分配很可能与string构造函数或(缺少)移动无关。

答案 1 :(得分:2)

参数onetwo是对 常量 std::string对象的右值引用。你怎么能从一个恒定的物体移动?

删除参数的const限定符。在大多数情况下,使用const限定符对于右值引用没有意义。

或者不要使用 const或rvalue引用(编译器应该创建正确的代码)。