C++ 在STL中使用memcpy

C++ 在STL中使用memcpy,c++,stl,C++,Stl,为什么C++的向量类调用复制构造函数?为什么它不存储底层数据呢?这会不会更快,并且消除对移动语义的一半需求 我无法想象这样的情况会更糟,但话说回来,可能只是因为我太缺乏想象力了。因为需要通知对象它正在移动。例如,可能有指向给定对象的指针需要修复,因为该对象正在被复制。或者,可能需要更新引用计数智能指针上的引用计数。或者 如果只是memcpy底层内存,那么最终会对同一个对象调用两次析构函数,这也是不好的。如果析构函数控制操作系统文件句柄之类的东西怎么办 编辑:总结以上内容: 复制构造函数和析构函数

为什么C++的向量类调用复制构造函数?为什么它不存储底层数据呢?这会不会更快,并且消除对移动语义的一半需求


我无法想象这样的情况会更糟,但话说回来,可能只是因为我太缺乏想象力了。

因为需要通知对象它正在移动。例如,可能有指向给定对象的指针需要修复,因为该对象正在被复制。或者,可能需要更新引用计数智能指针上的引用计数。或者

如果只是memcpy底层内存,那么最终会对同一个对象调用两次析构函数,这也是不好的。如果析构函数控制操作系统文件句柄之类的东西怎么办

编辑:总结以上内容:
复制构造函数和析构函数可能有副作用。这些副作用需要保留。

您可以安全地记忆POD和内置类型。这些被定义为除了作为一个关于内存的比特包之外没有任何语义

但是,具有构造函数和析构函数的类型必须构造和析构函数才能保持不变量。虽然您可以创建可以是memcpy并具有构造函数的类型,但很难在类型签名中表达这一点。因此,STL不会违反与所有具有构造函数和/或析构函数的类型相关联的不变量,而是在必要时使用复制构造函数来维护不变量


这就是C++0x通过右值引用添加移动语义的原因。这意味着STL容器可以利用提供移动构造函数的类型,并为编译器提供足够的信息,以优化其他昂贵的构造。

您可能想看看这里的一些注释,它们解释了为什么不使用memcpy:析构函数如何被调用两次?为什么引用计数需要更新?仍然有相同数量的参考资料!你记住了这个物体。现在有两份。需要对这两种类型调用析构函数。请注意,
std::copy
实际上可能使用
std::memcpy
当InputIter::value_类型与OutputIter::value_类型和POD相同时。@MSalters:这不完全正确。一对
std::list
s将满足这些要求,您当然不能在那里使用
memcpy
。它仅适用于
std::vector
std::basic_string
——即要求其内容连续的容器。