标准::移动 - 标准::内部指针
std::move - std::internal pointer
我很惊讶s和s2内部指向"sample"的指针不相等,这是什么解释?
#include <string>
#include <cassert>
int main()
{
std::string s("sample");
std::string s2(std::move(s));
assert(
reinterpret_cast<int*>(const_cast<char*>(s.data())) ==
reinterpret_cast<int*>(const_cast<char*>(s2.data()))
); // assertion failure here
return 1;
}
为什么你认为它们应该是相同的?您正在使用其移动构造函数从s
构造s2
。这会将数据所有权从s
转移到s2
,并使s
处于"空"状态。该标准没有详细说明这需要什么,但在此之后访问s
的数据(不先重新分配它(是不确定的。
string
的简化(和不完整(版本可能如下所示:
class string {
char* buffer;
public:
string(char const* from)
: buffer(new char[std::strlen(from) + 1])
{
std::strcpy(buffer, from);
}
string(string&& other)
: buffer(other.buffer)
{
other.buffer = nullptr; // (*)
}
~string() {
delete[] buffer;
}
char const* data() const { return buffer; }
};
我希望这说明为什么data()
成员不平等。如果我们省略了(*)
标记的行,我们将在main
末尾删除内部缓冲区两次:一次用于s
,一次用于s2
。重置buffer
指针可确保不会发生这种情况。
每个std::string
都有自己的缓冲区。您从另一个缓冲区移动了一个缓冲区这一事实不会使其共享一个缓冲区。当您初始化s2
时,它会从s
接管缓冲区并成为该缓冲区的所有者。为了避免s
"拥有"相同的缓冲区,它只是将s
的缓冲区设置为一个新的空缓冲区(s
现在负责(。
从技术上讲,还涉及一些优化,很可能没有为空字符串或非常小的字符串显式分配真正的缓冲区,而是std::string
的实现将使用std::string
内存本身的一部分。这通常称为 STL 中的小字符串优化。
另请注意,s
已被移走,因此您的代码访问其数据是非法的,这意味着它可以返回任何内容。
值替换为某个已知值之前,不应使用移自string
:
库代码需要在参数中保留有效值,但除非类型或函数另有文档,否则对生成的参数值没有其他约束。这意味着避免再次使用移自参数通常是最明智的。如果必须再次使用它,请确保在执行此操作之前使用已知值重新初始化它。
库可以将它想要的任何内容粘贴到字符串中,但很可能最终会得到一个空字符串。这就是从 cppreference 运行示例所产生的结果。但是,不应期望在移出对象中找到任何特定内容。
- 如何将元素插入到标准::地图的共享指针中?
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 非标准语法,使用 & 创建指向成员的指针
- 非标准语法使用 '&' 创建指向成员 C++ 的指针
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?
- 是否可以在标准弱指针之上实现非拥有"slightly smart"指针?
- 是否可以从标准输入指向指针的地址
- 您将如何使用标准引号解释指向基类和派生类成员的指针的这种差异?
- 'cv::Mat::type':非标准语法;使用 '&' 创建指向成员的指针
- registerPointPickingCallback (PCLViewer::callback_Test,(void*)&viewer);返回 C3687 非标准语法;使用"&"创建指向成员的指针
- C++ Visual Studio 2015:非标准语法;使用 '&' 创建指向成员的指针
- C 11中的标准方法是什么,可以访问std :: vector中元素n的指针
- 使用多个参数将成员功能指针转换为标准C函数
- 非标准语法;使用 & 创建指向成员的指针
- Visual Studio 2015"非标准语法;使用"&"为成员创建指针"
- 在标准布局对象中进行指针运算(例如,使用偏移量)时,我们是否需要使用 std::launder?
- 为什么std::unique_ptr比标准指针慢得多..在优化之前
- 将标准::指针列表转换为标准::值列表的快速方法
- 为什么c++共享指针的行为不像迭代器的标准指针
- C++中返回局部变量的引用和标准指针的替代方案是什么