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_iterator
从ifstream
复制。std::copy
对来源或目的地并不挑剔。相比之下,memcpy
要求您从连续的字节序列进行复制(并且这些序列是不相交的)。
std::copy
是一个简单的标准算法。它的通用版本只是在循环中使用赋值,因此它适用于与赋值相同的情况。库实现者通常会在安全的情况下通过
memcpy
进行std::copy
的特殊实现,并且比分配更快。由于memcpy
是一个遗留的C函数,因此几乎不应该在低级库之外的C++中使用它。::memcpy
和std::memcpy
实际上是一回事,因为它来自C标准库。从形式上讲,如果您#include <string.h>
,您应该使用::memcpy
,如果您#include <cstring>
,则应使用std::memcpy
,但实际上::memcpy
始终可用。