1. 程式人生 > >C++ trivial和non-trivial建構函式及POD型別

C++ trivial和non-trivial建構函式及POD型別

今天看書看到侯捷的《STL原始碼剖析》裡提到trivial和non-trivial及POD型別,查了些資料理解了一下。

trivial意思是無意義,這個trivial和non-trivial是對類的四種函式來說的:

  • 建構函式(ctor)
  • 複製建構函式(copy)
  • 賦值函式(assignment)
  • 解構函式(dtor)

如果至少滿足下面3條裡的一條:

  1. 顯式(explict)定義了這四種函式。
  2. 類裡有非靜態非POD的資料成員。
  3. 有基類。

那麼上面的四種函式是non-trivial函式,比如叫non-trivial ctor、non-trivial copy…,也就是說有意義的函式,裡面有一下必要的操作,比如類成員的初始化,釋放記憶體等。

那個POD意思是Plain Old Data,也就是C++的內建型別或傳統的C結構體型別。POD型別必然有trivial ctor/dtor/copy/assignment四種函式。

//整個T是POD型別class T
{//沒有顯式定義ctor/dtor/copy/assignemt所以都是trivialint a;//POD型別};//整個T1是非POD型別class T1
{
    T1()//顯式定義了建構函式,所以是non-trivial ctor{}//沒有顯式定義ctor/dtor/copy/assignemt所以都是trivialint a;//POD型別
    std::string b;//非POD型別};

那這有什麼用處呢?

如果這個類都是trivial ctor/dtor/copy/assignment函式,我們對這個類進行構造、析構、拷貝和賦值時可以採用最有效率的方法,不呼叫無所事事正真的那些ctor/dtor等,而直接採用記憶體操作如malloc()、memcpy()等提高效能,這也是SGI STL內部乾的事情。

比如STL的copy演算法最基本的想法是這樣的:

// 非POD過載指標數值template<class T>void copy(T* source, T* destination,int n, __false_type){// 省略異常處理for(; n >0; n--,source++,destination
++){// 呼叫source的複製建構函式 constructor(source,*destination);}}// POD過載指標數值template<class T>void copy(T* source, T* destination,int n, __false_type){// 省略異常處理 memmove(source, destination, n);}

當然實際的copy比這個複雜多了,有非常多的特化等,這個只是其中一方面而已。

此條目是由