Visual Studio不遵循移动语义

Dar*_*lyn -1 c++ visual-studio move-semantics c++11 visual-studio-2015

我在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;   
}
Run Code Online (Sandbox Code Playgroud)

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

在g ++下编译它会两次输出"Creating new",就像它应该的那样.

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

感谢帮助.

sba*_*bbi 5

这里有几个问题:

1)std::move不动,特别是如果你经过const &&.在这里这里看到答案.

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

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