C++ memcpy';ing std::C+中的字符串+;
对于特征矩阵库,有人提出了以下问题: 据我所知,问题在于不能对两个std::string进行基于memcpy的交换 在这里记忆似乎并不可取,但我也不理解记者指出的问题 如果std::string在概念上是:C++ memcpy';ing std::C+中的字符串+;,c++,memcpy,C++,Memcpy,对于特征矩阵库,有人提出了以下问题: 据我所知,问题在于不能对两个std::string进行基于memcpy的交换 在这里记忆似乎并不可取,但我也不理解记者指出的问题 如果std::string在概念上是: class string { union { class heap_str_ { char* str_; size_t len_; } char small_st
class string
{
union
{
class heap_str_
{
char* str_;
size_t len_;
}
char small_str[16];
}
};
我认为在memcpy(?)下,这两个都是可以的(所有权问题无法承受,我想交换也可以)
我在这里遗漏了什么?该bug包含以下详细信息: 内部数据不是存储位置不变的(将偏移量存储到此位置) 这立刻使你的假设失效 结构可能大致如下:
class string
{
char* str_;
union
{
size_t len_;
char small_str[16];
};
};
这样就可以访问
str
,而无需在每次访问时检查SSO。问题在于SSO对memcpy
不安全,因为指向数据的指针通常会重定向到对象堆栈部分内的内部缓冲区。因此,当对象复制到新位置时,指针仍然指向旧对象内的(旧的,可能不再有效的)位置
当然,std::string
(以及所有非POD类型)通常首先不应该是memcpy
,特别是在涉及堆分配时,因为它至少有双重删除或堆损坏的风险
所以不,你不应该,永远,永远,
memcpy
。即使你认为你应该/需要这样做。使用std::copy
或找出其他方法。您不能memcpy非POD,尤其是具有原始指针的POD。如果memcpy
,并且源超出范围,指针str
会发生什么情况?@Slava指针本身就是POD,OP的数据结构也是POD。显然,所有权语义是一个考虑因素,但指针本身完全可以作为memcpy的工具ed@Frank也许我自己不太清楚——这个对象拥有动态分配内存的原始指针。而且数据结构OP提到的绝对不完整,因为它是关于std::string
的,几乎可以肯定的是,您的string
类将管理str\uu
和delete
指向的缓冲区,或者在它的生命周期结束时释放它。通过对实例进行逐位复制,您将拥有两个对象,这两个对象都假定拥有该缓冲区的所有权。我想我的部分困惑是,std::string真的不是存储位置的不变量吗?好的,灯泡亮了。谢谢web上的一些其他实现建议像我一样实现,但看起来您的实现在实践中更为常见。事实上,这并不是一个概念性的记忆。