2010-11-07 447 views
2

我經常聲明類包裝單個Plain Old Data值;簡單的類沒有虛擬功能,如:C++:POD和POD包裝對象

class Velocity { 
    int vel; 
public: 
    // functions to work with velocity ... 
} 
  1. 與這樣的對象的工作是相同的與POD的值工作? - 如果在我的代碼中使用了int而不是Velocity,那麼空間或時間使用情況是否有所不同?標準是否對此有所說明?

  2. 我可以將指針或這樣的對象的陣列作爲POD值,反之亦然的指針/數組? - 我完全安全嗎Velocity *v = reinterpret_cast< Velocity* >(int_pointer)

回答

4

與這樣的對象的工作是相同的與POD的值工作?

不,您使用memcpy和其上的朋友並不完全安全(只允許使用POD!)。

我可以將一個指針或這樣的對象的數組作爲POD值的指針/數組嗎?

如果它是一個POD,你是絕對安全的。但這不是POD,因爲它有一個私人數據成員。


雙方的這一說,在實踐中它會正常工作的類(C++ 0x中,你允許使用這樣一類具有私有成員memcpy,因爲它允許所有可複製類型,包括您的類型和許多其他非POD)。

1

1)您的例子並不POD,因爲類有私有字段

2)標準沒有定義使用reinterpret_cast的時候會發生什麼。發生的任何事情都是實現定義的。

4

「與POD相同」,不完全在C++ 98中。 C++ 98不允許POD擁有私有成員。 C++ 0x提升了這個限制(和其他一些限制)。

提高效率,或缺乏效率,這是一個實施質量問題。

要求您的編譯器進行優化,然後進行測量,如果它很重要。

重鑄:否,具有實現定義的效果。不要這樣做。

Cheers & hth。,