很久以来,对于C++的基本概念,本人认为已经很熟透了,今天一个例子就把不足给暴露了。还好,这块重新捡起来特别快。
Copy Constructor and Assignment Operator FAQ, Part I
对于C++的拷贝构造函数和赋值重载函数,估计大家都不陌生。但如果说编译器默认产生的这个函数里面是什么内容呢?还有什么时候需要你去重新写一个拷贝构造函数和赋值运算符呢? 估计要一下子回答正确估计不易。
还好,上面的链接可以找到我们所需要的答案。不过如果说缺省的拷贝构造函数是member-wise的方式,估计大家不直观,至少我在这方面就把它和bitwise的方式混淆了。
还好,搜索到另外一篇blog,可以让我们很直观的来体会member-wise了。
Copy constructors, assignment operators, and exception safe assignment
| |
the compiler-provided copy constructor is exactly equivalent to:
| |
|
看到了吗? 所谓的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 |