請看下面這個結構體定義:
struct mystruct ; //s是
pod
struct ss };// ss不是
podstruct sss ; // ss
s不是pod
在c++0x
中,pod
被定義為可以簡單複製的,型別普通的,並且擁有可以應對多種
pod原先就能支援的操作的標準變數位址布局(?)。
pod的定義和以前差不多:
1)如果你所有的成員變數和基類都是
pod,那麼這個型別就是
pod。
2)pod
應當滿足以下要求,
a)沒有虛函式
b)沒有虛基類
c)沒有引用
d)沒有多重訪問
新標準對pod
最大的影響就是,對於擁有不會影響資料分配布局的建構函式的資料結構,也可以算作是
pod。
關於pod
回到最上面舉的那個例子,結構體初始化時,首先會呼叫它自動生成的預設建構函式,同時也會呼叫vector
的建構函式為
pstr
成員生成一塊記憶體。然後我們都知道,使用結構體一般都會用
memset
或 zeromemory
函式來把結構體清成
0,那麼當我們呼叫
zeromemory
後,之前為
pstr
生成的記憶體就變成了
0,這樣當在後面再訪問這個成員時,就會導致
crash
。所以一般情況下在結構體中不要定義一些複雜的資料型別,如果無法避免,就宣告這種型別的指標,因為指標肯定是乙個pod
的資料。
解決方法:
1)上面的那種方法可以把
pstr
換成指標型別,也就是
vector*
在呼叫zeromemory
後,再對這個變數分配記憶體。(世紀)
2)為這個結構體寫建構函式,在這個建構函式裡面進行初始化,在使用時永遠不要呼叫
zeromemory
,這樣的話,
struct
就實際上跟
class
的用法一樣了。
和結構體 結構體型別與結構體變數
結構體 struct 是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構體。在c語言中,結構體 struct 指的是一種資料結構,是c語言中聚合資料型別 aggregate data type 的一類。結構體可以被宣告為變數 指標或陣列等,用以實現較複雜的資料結構。結構體同時也是一些元素...
Haxe的結構體與匿名結構體
1 建立乙個匿名結構體 var mystructure 2 建立乙個復合匿名結構體 var user var start var target var current 引入typedef typedef point class path甚至匿名結構體還可以繼承 typedef point3 這樣就多...
結構體 共用體與列舉
part 1 一 結構體型別與程式設計應用 學生的記錄由學號和成績組成。n名學生的資料已在主函式中放入結構體陣列stu中。編寫函式 ndminlist,實現 把分數低的學生資料放在陣列t中,函式返回分數低的學生的人數。注意 分數低的學生可能不止乙個 include const int n 5 定義結...