Trivial(平凡)和Non-Trivial(不平凡)是對於class(類)的或者類中的四個函數而言的:
1.構造函數
2.拷貝構造函數
3.賦值函數
4.析構函數
Trivial
其中Trivial(平凡)的概念本人的理解是無意義的,Trivial是相對於Non-Trivial而言的。
Non-Trivial
對於Non-Trivial而言的,如果上面四種函數滿足以下三點任意一項或一項以上:
1.有基類
2.顯式(explict)定義了以上四種函數一種或以上
3.類里有非靜態非POD的數據成員
那么該類就是Non-Trivial(不平凡)有意義的,所以有意義(Non-Trivial)的函數都有一些“多余”的操作,和系統自動創建的默認缺省函數有些差別。而有意義(Non-Trivial)的類則是含有Non-Trivial的函數。
POD
POD(Plain Old Data)是指C風格的struct結構體定義的數據結構或者C++的內建類型。
C++ 03:對於POD對象,其二進制內容是可以隨便復制的,在任何地方,只要其二進制內容在,就能還原出正確無誤的POD對象。對於任何POD對象,都可以使用memset()函數或者其他類似的內存初始化函數。
如果一個類或結構是Trivial(平凡)的,具有標准布局的,且不包含任何非POD的非靜態成員,那么它就被認定是POD類型。POD類型必然有以上提到的四種Trivial(平凡)函數。
(本部分內容摘自https://www.cppfans.org/1431.html)
平凡的類或結構定義如下:
1.具有一個平凡的缺省構造器 (可使用default關鍵字)
2.具有一個平凡的拷貝構造器 (可使用default關鍵字)
3.具有一個平凡的拷貝賦值運算符(可使用default關鍵字)
4.具有一個非虛且平凡的析構器
具有標准布局的類或結構被定義如下:
1.所有非靜態數據成員均為標准布局類型
2.所有非靜態成員的訪問權限(public, private, protected) 均相同
3.沒有虛函數
4.沒有虛基類
5.所有基類均為標准布局類型
6.沒有任何基類的類型與類中第一個非靜態成員相同
7.要么全部基類都沒有非靜態數據成員,要么最下層的子類沒有非靜態數據成員且最多只有一個基類有非靜態數據成員。總之繼承樹中最多只能有一個類有非靜態數據成員。所有非靜態數據成員必須都是標准布局類型。
POD的優點
1.字節賦值, 代碼中我們可以安全的使用memset和memcpy函數對POD類型進行初始化和拷貝等操作
2.提供了對C內存布局的兼容,C++程序可以與C函數進行相互的操作,因為POD類型的數據在C++與C之間的操作總是安全的
3.保證了靜態初始化的安全有效,靜態初始化在很多時候能夠提高程序的性能,而POD類型的對象初始化往往更加簡單(比如放在目標文件的.bss段,在初始化中直接被賦0)
以上內容通過查詢資料整理還有在下部分愚見,侵刪。