2014-11-15 77 views
1

我有狀態類的一個狀態機層次結構:所有類對於空類的單繼承層次結構,sizeof平等是否有保證?

class BaseState 
{ 
public: 
    virtual ~BaseState {} 

    template<typename ToCompareWith> 
    bool in() const 
    { 
    return (dynamic_cast<const ToCompareWith*>(this) != 0); 
    } 
}; 

class SubState : public BaseState {}; 
class SubSubState : public SubState {}; 

在我的機器的sizeof返回4。我想知道這是否一致。我知道這不是多重繼承,因爲內存對齊更復雜。我想知道,因爲當轉換到新狀態(當前狀態實例存儲在基類指針中)時,我想使用放置新的(進入舊狀態存儲器位置)。我知道我可以在某處存儲我所有州的靜態圖,但這不是重點。

回答

1

不,不能保證通過從基地派生空的類而增加的大小。該標準允許不添加任何尺寸。

請注意,使用dtor/placement new替換對象僅適用於顯式管理對象時:例如,不能更改堆棧上的普通對象的類型。但是,您可以使用C++ 11不受限制的聯合。您只需列出所有可能的轉化並在狀態變化時銷燬/創建合適的成員。這樣你也不依賴於對象的大小。

+0

謝謝你的回答。目前我正在進行顯式刪除和新建,但是我擔心在系統的這個低層部分出現壞分配異常。我會看看無限制的工會。但是,我需要確保MSVC 2010已經支持它。 – Daniel

0

理論上我不知道具有虛函數的空類的所有實例是否具有相同的大小。

在實踐中,大多數C++實現使用這樣的實例中內部的隱式vtable指針,並且普遍認爲(隱式)_vptr構件的尺寸是sizeof(void*)

爲了符合標準的,可能使所有的union這樣的類(假設C++ 11)。

順便說一下,您使用dynamic_cast可能效率低下。

+0

謝謝你的回答。我知道dynamic_cast效率不高,但這些檢查並不經常執行。還有一些我在這裏省略的其他功能(即精確狀態檢查,我使用typeid - 這可能更快)。 – Daniel