C++ trivial和non-trivial构造函数及POD类型(转)
原博客地址http://blog.csdn.net/a627088424/article/details/48595525
最近正糾結(jié)這個(gè)問(wèn)題就轉(zhuǎn)過(guò)來(lái)了,做了點(diǎn)補(bǔ)充(參考《深度探索C++對(duì)象模型》)
trivial意思是無(wú)意義,這個(gè)trivial和non-trivial是對(duì)類(lèi)的四種函數(shù)來(lái)說(shuō)的:
- 默認(rèn)構(gòu)造函數(shù)(default constructor)
- 拷貝構(gòu)造函數(shù)(copy constructor)
- 賦值函數(shù)(copy assignment operator)
- 析構(gòu)函數(shù)(destructor)
如果至少滿足下面3條里的一條:
那么上面的四種函數(shù)是non-trivial函數(shù),比如叫non-trivial constructor、non-trivial copy constructor…,也就是說(shuō)有意義的函數(shù),里面有以下必要的操作,比如類(lèi)成員的初始化,釋放內(nèi)存等。
POD意思是Plain Old Data,也就是C++的內(nèi)建類(lèi)型或傳統(tǒng)的C結(jié)構(gòu)體類(lèi)型(C風(fēng)格的struct結(jié)構(gòu)體定義的數(shù)據(jù)結(jié)構(gòu))。POD類(lèi)型必然有trivial constructor/ destructor/?copy constructor?/ copy assignment operator四種函數(shù)。
?
//整個(gè)T是POD類(lèi)型 class T { //沒(méi)有顯式定義ctor/dtor/copy/assignemt所以都是trivial int a; //POD類(lèi)型 }; //整個(gè)T1是非POD類(lèi)型 class T1 { T1() //顯式定義了構(gòu)造函數(shù),所以是non-trivial ctor {} //沒(méi)有顯式定義ctor/dtor/copy/assignemt所以都是trivial int a;//POD類(lèi)型 std::string b; //非POD類(lèi)型 };那這有什么用處呢?
如果這個(gè)類(lèi)都是constructor/ destructor/?copy?constructor?/ copy assignment operator函數(shù),我們對(duì)這個(gè)類(lèi)進(jìn)行構(gòu)造、析構(gòu)、拷貝和賦值時(shí)可以采用最有效率的方法,不調(diào)用無(wú)所事事正真的那些consructor/destructor等,而直接采用內(nèi)存操作如malloc()、memcpy()等提高性能,這也是SGI STL內(nèi)部干的事情。
比如STL的copy算法最基本的想法是這樣的:
?
// 非POD重載指針數(shù)值 template <class T> void copy(T* source, T* destination, int n, __false_type) { // 省略異常處理 for (; n > 0; n--,source++,destination++) { // 調(diào)用source的復(fù)制構(gòu)造函數(shù) constructor(source, *destination); } } // POD重載指針數(shù)值 template <class T> void copy(T* source, T* destination, int n, __false_type) { // 省略異常處理 memmove(source, destination, n); }當(dāng)然實(shí)際的copy比這個(gè)復(fù)雜多了,有非常多的特化等,這個(gè)只是其中一方面而已。
轉(zhuǎn)載于:https://www.cnblogs.com/gwtfighter/p/5499534.html
總結(jié)
以上是生活随笔為你收集整理的C++ trivial和non-trivial构造函数及POD类型(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Open-E DSS V7 应用系列之三
- 下一篇: android studio 中的编码问