四个术语:
不存在于同一意义轴上。
深拷贝是大多数人在大多数情况下对编程中语义对象的期望,当他们说:“计算机,给我一份”。
具体来说,在 C++ 的上下文中,这意味着现有对象的副本也递归地复制了所有子对象,无论它们是如何实现的。 (指针,ints,其他复杂对象,...)
浅拷贝是当你没有考虑到对象的一些直接内存成员实际上是指针(某种类型)并且你只复制它们的“指针”时得到的结果value”,而不是遵循间接并创建指向对象的正确副本。
当编译器执行简单的成员复制(见下文)并且您的对象包含(原始)指针时,您在 C++ 中得到的就是浅复制。如果您对任何对象进行简单复制,浅拷贝也是您在 Java 或 C# 中得到的,因为在那里,“一切”都是指针/引用。
如果您有一个可简单复制的对象,例如struct 只包含 ints 那么浅拷贝与深拷贝相同。
按位复制是您在 C++ 中对内存中对象执行 memcpy() 时得到的结果。结果可能是语义上的深拷贝,或者(更可能)是浅拷贝(如果涉及指针),或者它可能只导致内存中的一堆位不再是被复制类型的有效对象的形式来自。
最后,Memberwise Copy 是 C++ 中的一个特定术语,由 C++ Std 调用,用于说明编译器生成的 C'tor 副本 em> 将在被调用时执行。具体来说:
非联合类 X 的隐式定义的复制/移动构造函数执行其基类和成员的成员复制/移动。 (...)
在[class.copy.ctor] 中,它继续描述这意味着什么:
每个基本或非静态数据成员都以适合其类型的方式复制/移动:(...)
(!!) 成员复制可以在语义上等效于上述 3 种类型中的所有,具体取决于对象。
(此时我注意到 C++ 标准始终使用“memberwise”,而不是“member-wise”,但我的自动更正更喜欢“member-wise”或“member-wise”——这在谷歌搜索时可能会有所帮助。)
就我而言,如果您有用户定义的复制 ctor,您永远不会(应该)看到 1:1 成员复制,因为如果您做 1:1 成员复制,你不需要实现 ctor,编译器会为你生成它。
做几个比较:
- 如果你有一个
structof ints,那么按成员复制的结果与按位复制相同,它是浅复制和深复制(嗯,没有深度 t 说话)。
- 如果你有一个
struct 的int* 指针,比成员复制和按位复制一样,也是浅复制,但不再是深复制,因为复制会指向与原始整数相同。
- 如果您有一个包含任何重要对象的结构(例如
std::string),则按位复制不再有效,并且成员复制是浅还是深取决于子对象的实现:如果子对象都在复制构造上实现深复制,则副本是深的。如果您有任何只执行浅拷贝的子对象成员,那么逐个成员的拷贝也将是(部分)浅拷贝。