0

Cppreference 状态,关于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()

另外,我刚刚在我的“安置新”答案中意识到,这让我想知道这整件事,我只是使用memcpy()而不是std::memcpy(),而我不是 using namespace std;,所以调用了哪个函数?是memcpy()不同的实现std::memcpy()吗?

4

2 回答 2

4

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

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

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

于 2020-09-16T03:53:00.413 回答
3
  1. std::copy是一个简单的标准算法。它的通用版本只是在循环中使用赋值,因此它适用于与赋值相同的情况。在安全且比赋值更快的情况下,库实现者通常会有一个特殊的std::copythrough实现。memcpy由于memcpy是一个遗留的 C 函数,它几乎不应该在低级库之外的 C++ 中使用。

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

于 2020-09-16T03:43:41.747 回答