适用于"memcpy()"的相同可复制限制是否也适用于"std::copy()"



Cppreference声明,关于std::memcpy()(着重号是加的):

如果对象可能重叠或不可简单复制,则未指定memcpy的行为,并且可能未定义。

因此,在使用memcpy()之前,我总是检查以确保对象是可复制的,如下所示:

#include <type_traits>
static_assert(std::is_trivially_copyable<T>::value, "Type T must "
"be a trivially-copyable type in order to guarantee that `memcpy()` is safe "
"to use on it.");
memcpy(&outputData, &data, sizeof(data));

然而,std::copy()似乎没有这个限制:https://en.cppreference.com/w/cpp/algorithm/copy。

类型必须易于复制才能没有未定义的行为的这种限制是否不适用于std::copy()

另外,我刚刚意识到我的"放置新"答案,这让我对整个事情感到疑惑,我只用了memcpy()而不是std::memcpy(),而且我没有using namespace std;,那么调用了哪个函数?memcpy()std::memcpy()不同的实现吗?

memcpy

是一个复制字节的函数。std::copy复制对象。在某些情况下,复制对象的字节可以复制对象。

但这些不是一回事。std::copy将内存的字节复制视为在某些情况下追求其目标的潜在优化:复制对象。这是一个实现细节。对于memcpy,字节复制是它所做的;字节复制有时可以复制对象可能是一个附带好处。

还应该注意的是,std::copy在泛型迭代器上运行。它可以通过适当的ostream_iterator"复制"到ofstream中,也可以通过istream_iteratorifstream复制。std::copy对来源或目的地并不挑剔。相比之下,memcpy要求您从连续的字节序列进行复制(并且这些序列是不相交的)。

std::copy
  1. 一个简单的标准算法。它的通用版本只是在循环中使用赋值,因此它适用于与赋值相同的情况。库实现者通常会在安全的情况下通过memcpy进行std::copy的特殊实现,并且比分配更快。由于memcpy是一个遗留的C函数,因此几乎不应该在低级库之外的C++中使用它。

  2. ::memcpystd::memcpy实际上是一回事,因为它来自C标准库。从形式上讲,如果您#include <string.h>,您应该使用::memcpy,如果您#include <cstring>,则应使用std::memcpy,但实际上::memcpy始终可用。

相关内容

最新更新