作者holymars ()
看板C_and_CPP
标题Re: [问题] pointer问题
时间Mon Sep 14 08:43:27 2009
: TYPEA* p1;
: TYPEA* p2;
:
: 想请问版上的有经验的版友
:
: 有没有比较聪明的写法
*p2 = *p1;
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 140.113.190.181
: 推 LPH66:memmove(p2,p1,sizeof(TYPEA)); 这样? 09/14 00:39
: → helloken:谢谢一楼 我会试试看 09/14 00:44
memmove/memcpy作用在non-trivial class上会炸掉..
因为vptr会一起被copy过去
*p2 = *p1;
这种写法的好处在於 你不用管class是不是trivial
根据Inside the C++ object model
一个好的compiler会自动为具有bitwise copy sementic的class进行bitwise copy
也就是不会实际合成一个copy assignment operator function
所以
1、如果你的class是trivial的 *p2 = *p1; 和memmove的意思是一样的
2、如果你的class是non-trivial
编译器会自动帮你合成一个default memberwise copy assignment
*p2 = *p1 就相当於去呼叫上面这个operator=
: → VictorTom:有个问题, 如果TYPEA有pointer又是另外配置空间来的, 单 09/14 01:14
: → VictorTom:纯memcpy的行为还是处理不了这个状况; 事实上个人以为, 09/14 01:15
: → VictorTom:复杂一点的结构特地写一个copy function反而是好事, 09/14 01:16
另外就是像V板友提到的
不管是memcpy或是*p2 = *p1;
都不会有deep copy语意 这又是另一个问题了..
如果你需要class有deep copy语意,只能
1.自己写一个 void copy_from(const T&)
2.overload T& operator=(const T&)
3.在class内改用具有deep copy语意的指标
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.13.219
※ 编辑: holymars 来自: 114.32.13.219 (09/14 09:03)
1F:→ VictorTom:推~~前阵子才学会deep copy这个术语:) 09/14 09:57
2F:推 helloken:感谢回应 很有帮助 09/14 19:43