std::string t1("aaa");
const char *p = t1.c_str();
std::string t2(std::move(t1));
if (p == t2.c_str()) {
std::cout << "ok!" << std::endl;
}
此代码在 vs2012 中未打印任何内容。它只是在内部使用memmove
将t1
中的字符串复制到t2
。为什么?
最佳答案
正式地,正如 jrok 所指出的,你正在做的是
未定义的行为,所以你无权提示,不管
实现是做什么的。实际上,这将取决于
实现。标准不需要 move
std::string
的构造函数对
源字符串。如果实现使用小字符串
优化(如 VC++,例如),字符串是
小到符合条件,那么它就无能为力了
但是 memcpy 字符;它们在 char[]
中
字符串对象本身。 CoW 实现(如 g++ 中的实现)可能
没有做任何与它在拷贝中所做的不同的事情
构造函数,因为它不值得
打扰;你不会真的节省很多。 (但它可能,因为只是
交换指针会节省一点。)
我刚刚在 VC++ 中尝试了同样的事情,但是字符串是 100 人物。它进行了交换(并且两个指针相等)。 所以 VC++ 的行为取决于字符串是否是 小到足以让 SSO 应用。 G++ 在所有情况下都会交换。
关于c++ - 在vs2012中 move 一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250539/