适用于`memcpy`的同等可复制限制也适用于`std :: copy`吗?

问题描述

Cppreference states,关于std::memcpy()(强调):

如果对象可能重叠或不可Triviallycopyable,则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()吗?

此外,我刚刚意识到in my "placement new" answer here,这使我对整个事情感到疑惑,我只使用memcpy()而不是std::memcpy(),而我不是 using namespace std;,那么调用了哪个函数memcpy()std::memcpy()的实现不同吗?

解决方法

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

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

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

,
  1. std::copy是一种简单的标准算法。它的通用版本仅在循环中使用分配,因此它在与分配相同的情况下适用。在安全的前提下,库实现者通常会使用std::copymemcpy的特殊实现,并且比分配要快。由于memcpy是旧版C函数,因此几乎不应在低级库之外的C ++中使用它。

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