Re: [問題] pointer問題
: 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)
→
09/14 09:57, , 1F
09/14 09:57, 1F
推
09/14 19:43, , 2F
09/14 19:43, 2F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章