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