还好,上面的链接可以找到我们所需要的答案。不过如果说缺省的拷贝构造函数是member-wise的方式,估计大家不直观,至少我在这方面就把它和bitwise的方式混淆了。
1
2
3
4
5
|
class MyClass {
int x;
char c;
std::string s;
};
|
the compiler-provided copy constructor is exactly equivalent to:
1
2
3
|
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s )
{}
|
MyClass& MyClass::operator=( const MyClass& rhs ) {
x = other.x;
c = other.c;
s = other.s;
return *this;
}
|
看到了吗? 所谓的member-wise就是编译器逐个的成员进行赋值操作,而不是等同于bitwise(也就是memcpy).
the difference between member-wise copying and bitwise copying (such as a memcpy()call) is significant in two cases:
- copying of subobjects
- copying of padding bytes
也就是第一篇文章中介绍的,我把上面的翻译一下:
成员方式的拷贝(member-wise copying)和位方式的拷贝(bitwise copying,也就是通过memcpy之类来实现的拷贝)主要差别在于两方面:
1. 子对象的拷贝
2. padding字节的拷贝
位方式拷贝,是把整个内存的内容都拷贝过去,这在有子对象的情况下是个灾难。估计大家都知道。
但有时发现自己没有子对象,只是简单的数值类型时,一定要主要padding的字节,尽量不要通过memcmp来比较两个对象的类容是否相等。要通过member-wise的方式,逐个成员数据进行比较 (切记)。
终于把这块短板不起来了,呵呵。
后记,为了进一步巩固先前的模糊的部分,贴上另外一个blog。 关于什么是POD的类型?
POD主要是用于和C代码来打交道的。什么是POD结构(Plain Old Data)? http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html
expression |
POD type T |
non-POD type T |
new T |
not initialized |
default-initialized |
new T() |
always default-initialized |
new T(x) |
always initialized via a constructor |