gpt4 book ai didi

c++ - 字符串移动赋值交换值

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:02 24 4
gpt4 key购买 nike

我在编写一些测试用例时注意到一个奇怪的行为。

对一个字符串的移动赋值并没有删除第一个字符串的值,而是赋给了目标字符串的值。

示例代码:

#include <utility>
#include <string>
#include <iostream>

int main(void) {
std::string a = "foo";
std::string b = "bar";
std::cout << a << std::endl;
b = std::move(a);
std::cout << a << std::endl;

return 0;
}

结果:

$ ./string.exe
foo
bar

预期结果:

$ ./string.exe
foo

所以我的问题是:

  • 这是故意的吗?
  • 这是否只发生在字符串和/或 STL 对象上?
  • 自定义对象(如用户定义的)是否会发生这种情况?

环境:Win10 64位系统2g++ 5.2

编辑

阅读可能重复的答案和@OMGtechy 的答案后我扩展了测试以检查小字符串优化。

#include <utility>
#include <string>
#include <iostream>
#include <cinttypes>
#include <sstream>

int main(void) {
std::ostringstream oss1;
oss1 << "foo ";
std::ostringstream oss2;
oss2 << "bar ";
for (std::uint64_t i(0);;++i) {
oss1 << i % 10;
oss2 << i % 10;
std::string a = oss1.str();
std::string b = oss2.str();
b = std::move(a);
if (a.size() < i) {
std::cout << "move operation origin was cleared at: " << i << std::endl;
break;
}
if (0 == i % 1000)
std::cout << i << std::endl;
}

return 0;
}

这在我的机器上运行高达 1 MB,这不再是一个小字符串。它刚刚停止,所以我可以在此处粘贴源代码(阅读:我停止了它)。

最佳答案

这可能是由于短字符串优化;也就是说,没有内部指针可以“移动”过去,所以它最终就像一个拷贝一样。

我建议您尝试使用包含大量字符的字符串;这应该足以绕过短字符串优化并表现出您预期的行为。

这是完全有效的,因为从对象移动的 C++ 标准状态(除了一些异常(exception),从 C++11 开始,字符串不是其中之一)应处于有效但未指定的状态。

关于c++ - 字符串移动赋值交换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36422589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com