社区
C++ 语言
帖子详情
一个关于拷贝构造函数的问题
RMS_forever
2008-03-01 08:51:22
在深度探索C++对象模型中,有一个地方一直不太明白,作者开始提出问题:如果一个对象满足bitwise copy时,那么编译器会不会优化从而抑制拷贝构造函数的调用?这个问题我一直看的一头雾水,求高人指教,顺便问下什么是bitwise copy?
...全文
189
10
打赏
收藏
一个关于拷贝构造函数的问题
在深度探索C++对象模型中,有一个地方一直不太明白,作者开始提出问题:如果一个对象满足bitwise copy时,那么编译器会不会优化从而抑制拷贝构造函数的调用?这个问题我一直看的一头雾水,求高人指教,顺便问下什么是bitwise copy?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
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 年的贴子都能找出来..
相关推荐
iOS开发教程之OC语言
Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。
三说 拷贝构造之禁用
关于C++的
拷贝构造函数
,很多的建议是直接禁用。为什么大家会这么建议呢?没有
拷贝构造函数
会有什么限制呢?如何禁用拷贝构造呢?这篇文章对这些
问题
做
一个
简单的总结。这里讨论的
问题
以
拷贝构造函数
为例子,但是通常赋值操作符是通过
拷贝构造函数
来实现 的( copy-and-swap 技术,详见《Exceptional C++》一书),所以这里讨论也适用于赋 值操作符,通常来说禁用
拷贝构造函数
的同时也会禁用赋值操作符。关于
拷贝构造函数
的禁用原因,我目前了解的主要是两个原因。第一是浅拷贝
问题
,第二 个则是基类拷贝
问题
。编
【C++学习】关于
拷贝构造函数
个人理解
一、什么是
拷贝构造函数
? 构造函数按类型可以分为 普通构造函数 与
拷贝构造函数
拷贝构造函数
格式:类名(const 类名& 形参名) 默认
拷贝构造函数
作用:对属性进行值拷贝(遇到指针会出现深拷贝与浅拷贝的
问题
),代码类似于 Person(const Person& p) { this->m_a = p.m_a; this->m_b = p.m_b;//会出现浅拷贝带来堆区内存重复释放
问题
} int m_a; int *m_b; 二、什么时候调用
拷贝构造函数
拷贝构造函
为什么禁用拷贝(复制)构造函数
关于C++的
拷贝构造函数
,很多的建议是直接禁用。为什么大家会这么建议呢?没有拷贝构 造函数会有什么限制呢?如何禁用拷贝构造呢?这篇文章对这些
问题
做
一个
简单的总结。 这里讨论的
问题
以
拷贝构造函数
为例子,但是通常赋值操作符是通过
拷贝构造函数
来实现 的( copy-and-swap 技术,详见《Exceptional C++》一书),所以这里讨论也适用于赋 值操作符,通常来说禁用
拷贝构造函数
的同时也会禁用赋值操作符。 为什么禁用
拷贝构造函数
关于
拷贝构造函数
的禁用原因,我目前了解的主要是两个原因。第一是浅拷贝
问题
c++
拷贝构造函数
拷贝构造函数
爆炸性先验结论c++调用
拷贝构造函数
时,不会调用类的构造函数。(
拷贝构造函数
也是构造函数的一种,每次只调用
一个
构造函数)。
问题
描述很多人对c++的
拷贝构造函数
和赋值=运算区分不清楚。
发帖
C++ 语言
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
6.3w+
社区成员
25.0w+
社区内容
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
帖子事件
创建了帖子
2008-03-01 08:51
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下