這個問題的標題是相當複雜的,所以我會嘗試用一個例子對它進行框架。假設我有一個抽象基類,有許多繼承自它的類。在下面的例子中,我只展示了兩個繼承的類,但實際上可能會有更多。靜態分配繼承對象數組
class Base {
public:
Base();
virtual ~Base() = 0;
/// Other methods/members
};
class SmallChild: public Base {
public:
SmallChild();
~SmallChild();
/// Other methods/members such that sizeof(SmallChild) < sizeof(LargeChild)
};
class LargeChild : public Base {
public:
LargeChild();
~LargeChild();
/// Other methods/members such that sizeof(LargeChild) > sizeof(SmallChild)
};
我需要實現一個容器,它最多可以存儲N
繼承的對象。這些對象需要在運行時創建/銷燬並放置在容器中,但由於項目中的約束(特別是在嵌入式硬件上),動態內存分配不是一種選擇。容器需要靜態分配所有空間。另外,編譯器不支持C++ 11。
只有一種方法可以實現。爲了引用N
對象,我首先需要創建一個指向基類的指針數組,然後實際存儲對象,我需要創建一個足夠大的緩衝區來存儲最大繼承對象的副本,在這種情況下是LargeChild
Base * children[N];
uint8_t childBuffer[N * sizeof(LargeChild)];
我可以隨後在children
分配指針橫跨childBuffer
,每個都由sizeof(LargeChild)
分離。由於需要創建對象,因此可以使用C++的「placement new」將它們放置在數組中的指定位置。我需要跟蹤childBuffer
中每個對象的類型,以取消引用children
中的指針,但這不應該太糟糕。
我有一個關於這個整個設置/執行幾個問題:
這是一個很好的方法爲我所描述它解決問題?我從來沒有像以前那樣執行過任何操作,所以我不知道我是否在這裏吃午飯,還有更簡單的方法來完成此任務。
這可以在編譯時完成多少?如果我有
M
類型的繼承類(SmallChild
,LargeChild
等)但我不知道知道它們的大小相互關係,我怎麼能確定大小childBuffer
?這個大小取決於最大類的大小,但是有沒有辦法在編譯時確定這個大小?我可以想象一些預處理器宏遍歷類,評估sizeof
並找到最大值,但是我對這個級別的預處理器工作很少有經驗,不知道這會是什麼樣子。我也可以想象使用模板可以做到這一點,但是我再也沒有關於編譯時模板魔法的經驗,所以我只是基於我的直覺。任何方向如何實施這將不勝感激。
這有幫助嗎? http://stackoverflow.com/questions/354442/looking-for-c-stl-like-vector-class-but-using-stack-storage – PaulMcKenzie 2014-09-02 17:27:29
如果你有一個派生類型的列表,那麼宏+預處理器可以工作與那個名單找到最大的類型。將所有派生類型的列表放在一個地方是否可行?另外,多大(約)是最大的? – 2014-09-02 17:43:05
第一次擦除後是否會插入插入物,還是混在一起? – 2014-09-02 17:44:18