一个关于拷贝构造函数的问题

RMS_forever 2008-03-01 08:51:22
在深度探索C++对象模型中,有一个地方一直不太明白,作者开始提出问题:如果一个对象满足bitwise copy时,那么编译器会不会优化从而抑制拷贝构造函数的调用?这个问题我一直看的一头雾水,求高人指教,顺便问下什么是bitwise copy?
...全文
189 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieao111 2008-03-12
  • 打赏
  • 举报
回复
如果一个对象满足bitwise copy时,那么编译器会不会优化从而抑制拷贝构造函数的调用?

这句话翻译的也真....
Chappell 2008-03-02
  • 打赏
  • 举报
回复
顶5楼
wyk123 2008-03-02
  • 打赏
  • 举报
回复
5楼是正确的
fish6344 2008-03-01
  • 打赏
  • 举报
回复
第一个问题:

如果一个类,仅使用封装和继承(无需运行时多态或virtual继承),且继承体糸中之成员对象或上层subObject无考贝构造函数,例如:

class A
{
long _lAData;//...
//未声明有考贝构造函数!
};

class C{//未声明有考贝构造函数!};

class B : public A
{
long _lBData;
};

上述类声明,按C++标准,就被称为有"bitwise copy"语意。有这样语意的类实例之考贝动作,纯属数据搬移,例如:

B b1;
B b2(b1);//考贝建构b2,其操作就是简单的把b1的数据成员考贝至b2。

反之,如果类有虚函数或是有virtual继承或是其类体糸中其成员对象或subObject声明有考贝构造函数,例如:

class A
{
public:
virtual void show(void){}//有虚函数!
};

class B : public A//B类无"bitwise copy"语意!
{
long _lBData;
};

或是:

class A{};
class C : public virtual A{};//virtual继承!
class B : public virtual A{};//virtual继承!
class D : public C,public B{};//D类无"bitwise copy"语意!

或是:

class A{ public: A(A& _a){}}//有考贝构造!
class B : public A{};B类无"bitwise copy"语意!

上述几种情况都无"bitwise copy"语意, 这需要编译器介入,合成隐晦的考贝构造函数并在其中设立虚函数表指针或关于多重继承下后继基类的偏移量设置以及确保继承体糸中所有其它的考贝构造函数被调用!

关于第二个问题,按候捷的翻译,"bitwise copy"中文意为"位逐次考贝",在《深度探索C++对象模型》并无专门的说明,我理解实质不外就是成员搬移而已。








michney 2008-03-01
  • 打赏
  • 举报
回复
这里指的bitwise copy就是深拷贝,相对于编译器默认生成的浅拷贝(影子拷贝)
意思是:如果类里面的有一个指针成员指向一块内存,浅拷贝的构造函数会简单把指针值赋值给调用者的相应成员
这样两个指针指向了同一块内存,
当第一个对象销毁时,调用析构函数,把自己的内存释放,第二个对象的内存也失效了,指针就变成无效指针了,
这样很危险。

有时候可以阻止编译器自己生产浅拷贝的构造函数,这样就可以避免上述危险。
RMS_forever 2008-03-01
  • 打赏
  • 举报
回复
是不是说位拷贝的话就只是讲内存的内容按位拷贝给另一个对象?那么现在第二个问题解决了,第一个问题呢
visame 2008-03-01
  • 打赏
  • 举报
回复
MARK...
ryfdizuo 2008-03-01
  • 打赏
  • 举报
回复
你说的是位拷贝吧,
http://www.80diy.com/home/20050826/19/4234025.html
RMS_forever 2008-03-01
  • 打赏
  • 举报
回复
自己先顶一下
jieao111 2008-03-01
  • 打赏
  • 举报
回复
dizuo 05 年的贴子都能找出来..
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-01 08:51
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下