Visual studio 不遵循移动语义
Visual studio not following moving semantic
我正在 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;
}
这段代码在Visual studio中输出了4次"Creating new",也就是说分配了4次内存。然而,按照语义,它应该只分配两次(在数据段中创建 2 个文字,创建一个和两个函数参数 = 2 个分配,然后将它们的资源移动到 a 和 b 成员变量)
在 g++ 下编译输出 "Creating new" 两次,这是应该的。
是否需要设置任何设置才能让 VS 遵循移动语义?据我所知应该是默认支持的
感谢您的帮助。
参数 one
和 two
是对 constant std::string
对象的右值引用。你怎么能从一个常量对象移动?
删除参数的 const
限定符。在大多数情况下,使用 const
限定符对右值引用没有意义。
或者不使用 const
或右值引用(无论如何编译器应该创建正确的代码)。
这里有几个问题:
1) std::move
不会移动,特别是如果你经过 const &&
。查看答案 and here.
2) 我所知道的每个 std::string
实现都使用小缓冲区优化。当使用短字符串(例如 "one"
)构造时,此类实现将永远不会分配。
3) 允许标准库运行时在静态初始化期间调用operator new
,例如设置std::cout
。您看到的分配很可能与 string
构造函数或(缺少)移动无关。
我正在 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;
}
这段代码在Visual studio中输出了4次"Creating new",也就是说分配了4次内存。然而,按照语义,它应该只分配两次(在数据段中创建 2 个文字,创建一个和两个函数参数 = 2 个分配,然后将它们的资源移动到 a 和 b 成员变量)
在 g++ 下编译输出 "Creating new" 两次,这是应该的。
是否需要设置任何设置才能让 VS 遵循移动语义?据我所知应该是默认支持的
感谢您的帮助。
参数 one
和 two
是对 constant std::string
对象的右值引用。你怎么能从一个常量对象移动?
删除参数的 const
限定符。在大多数情况下,使用 const
限定符对右值引用没有意义。
或者不使用 const
或右值引用(无论如何编译器应该创建正确的代码)。
这里有几个问题:
1) std::move
不会移动,特别是如果你经过 const &&
。查看答案
2) 我所知道的每个 std::string
实现都使用小缓冲区优化。当使用短字符串(例如 "one"
)构造时,此类实现将永远不会分配。
3) 允许标准库运行时在静态初始化期间调用operator new
,例如设置std::cout
。您看到的分配很可能与 string
构造函数或(缺少)移动无关。