c tricks POD與結構體宣告

2021-08-19 18:49:45 字數 1109 閱讀 3687

請看下面這個結構體定義:

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 定義結...