c++ - 在vs2012中 move 一个字符串

标签 c++ string c++11 move

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 中未打印任何内容。它只是在内部使用memmovet1 中的字符串复制到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/

相关文章:

c++ - std::array:size和max_size返回相同的数字(如果array中的元素较少)

c++ - 需要特定参数包大小的C++模板概念

c++ - 更改 vector 中的值后,make_heap 无法按预期工作?

C++ 从字符串中取前 8 个符号

c++ - 使用自定义散列函数插入 unordered_set

c++ - Linked list operator= 当移动赋值时,所有元素都被移动

java - 这可能吗? : HashMap<String, 字符>

c - 在 C 中使用相等运算符 == 比较两个字符串是否相等

c++ - 为什么 std::to_string 的实现会创建一个 4 倍于类型大小的缓冲区?

c++ - 如何在具有 copy-and-swap 习语的赋值运算符中使用 noexcept?