目录
- 比较
- 例子
- 不适用std::copy却适用memcpy的场景
- 适用std::copy不适用memcpy的场景
std::copy和memcpy都可以用于内存块之间的复制操作,但有几个重要的异同点:
相同点:
不同点:
下面给出两个个分别用std::copy和memcpy拷贝char*p[1024]内容的例子
#include
#include int main()
{char* p[1024] = {"Hello", "World", "!"};// 使用std::copy拷贝char* copy_p[1024];std::copy(std::begin(p), std::end(p), std::begin(copy_p));// 使用memcpy拷贝char* memcpy_p[1024];std::memcpy(memcpy_p, p, sizeof(p));return 0;
}
#include
#include int main()
{const char* p = "Hello, world!";// 使用std::copy拷贝char copy_p[1024]; // 目标数组需要足够大以容纳源字符串std::copy(p, p + std::strlen(p) + 1, copy_p);std::cout << copy_p << std::endl;// 使用memcpy拷贝char memcpy_p[1024]; // 目标数组需要足够大以容纳源字符串std::memcpy(memcpy_p, p, std::strlen(p) + 1);std::cout << memcpy_p << std::endl;return 0;
}
在这个例子中,我们有一个名为p的指向字符串"Hello, world!"的指针。我们想要将这个字符串复制到另外两个数组copy_p和memcpy_p中。
对于使用std::copy的情况,我们创建一个名为copy_p的新字符数组,并调用std::copy函数来从源字符串p中复制所有字符到目标数组copy_p中。
对于使用memcpy的情况,我们创建一个名为memcpy_p的新字符数组,并调用std::memcpy函数来从源字符串p中复制所有字符到目标数组memcpy_p中。由于我们知道源字符串的长度,所以我们可以直接使用std::strlen§ + 1来计算复制的字节数量(需要加上字符串结束符’\0’)。
虽然std::copy和memcpy都可以用于内存块的复制,但是有一些情况下,可能更适合使用memcpy而不是std::copy:
总之,当你确信要复制的内存区域是平凡类型,且源和目标内存区域没有重叠时,使用memcpy可能更加高效。但是在复杂情况下,还是推荐使用std::copy以确保正确的类型安全和生命周期处理。
#include
#include
#include class Person {
public:Person() {}Person(const std::string& name) : name_(name) {}virtual ~Person() {std::cout << name_ << std::endl;} // 虚析构函数virtual void print() const { std::cout << "Person: " << name_ << std::endl; }
private:std::string name_;
};int main()
{Person p1("Alice");Person p2("Bob");// 使用memcpy进行拷贝Person copied_p1;std::memcpy(&copied_p1, &p1, sizeof(Person)); // 此处使用了未定义的行为return 0;
}
在这个例子中,我们定义了一个名为Person的类,它包含一个带有虚析构函数的成员函数,并且我们试图使用memcpy从一个Person对象(p1)复制到另一个对象(copied_p1)。但由于Person类有虚析构函数,所以使用memcpy将导致未定义的行为。
Alice
Bob
Alice
对于这种情况,我们应该使用std::copy来确保正确的生命周期和内存管理