2016-02-12 26 views
3

因此,我正在研究一個內存相當有限且沒有MMU的小型ARM嵌入式系統。我有幾個對象需要爲不同的函數動態分配,而這些函數都是從同一個超類繼承的,但是執行不同的函數並且可能有不同的大小。我沒有足夠的內存可用於在啓動時將它們全部實例化,並將它們留在原地。找出幾個放置對象的最大尺寸

因此,作爲一個例子,我有可能的對象定義有點像:

class Waveform1 : public OutputStream 
class Waveform2 : public OutputStream 
class Waveform3 : public OutputStream 

和子類都將有不同的尺寸因爲有些人可能有更少的方法和比別人私有變量,但可能沒有人會比任何其他人都大得多。

我希望做的是分配緩衝區與放置在系統啓動時新是大到足以容納最大的定義的對象來使用。然後,我應該可以實例化並銷燬那些沒有問題的對象,因爲它總是足夠大以容納所需的最大對象。我希望這會被自動處理,因爲隨着系統設計的進展,新的對象可能被添加到列表中。

有沒有做到這一點,所以可能有點看起來像我知道我在做什麼規範呢?

+1

'std :: max({sizeof(Waveform1),sizeof(Waveform2),sizeof(Waveform3)})'? – Jarod42

+0

@ Jarod42 Err ...我忘了提及,STL可能不可用。 :( – Bitrex

+0

'max'應該足夠簡單,重新實現 – Jarod42

回答

2

我過去所做的是用一個字符數組的聯盟和所有我需要它來存儲的類型。好處是緩衝區將正確對齊。

喜歡的東西:

class MyClass { 
    public: 
     union { 
      char buffer[1]; 
      ClassA a; 
      ClassB b; 
     }; 
    MyClass() {} 
    ~MyClass() {} 
}; 

請注意,你可以離開了char buffer[1]和安置新權到工會的類成員,如new (&a) ClassA。還要注意,如果ClassA或ClassB是除POD之外的任何東西,那麼這隻適用於C++ 11。

現在,事實證明,我所做的實際上做的與我記得做的不同。可能是因爲我不得不支持C++ 03。在我實際的代碼我這樣做:

char DECLARE_ALIGN(8) buffer[ sizeof(int*) * 8 ]; 

DECLARE_ALIGN可以是:

# define DECLARE_ALIGN(x) __attribute__((aligned(x))) 

或者

# define DECLARE_ALIGN(x) __declspec(align(x)) 
在後面的代碼

,然後在該功能實際上是分配對象並作爲buffer_len我已通過緩衝器後作爲一個指針,和sizeof(緩衝液):

assert(buffer==0 || buffer_len >= sizeof(BTreeNodeWriter_X<X>)); 
assert(buffer==0 || buffer_len >= sizeof(BTreePackedNodeWriter_X<X>)); 
+0

爲什麼'字符緩衝區[1 ?]'做'新(u.buffer)WaveFormX' – Jarod42

+0

@ Jarod42是與安置新 –

+0

你可能因此使用*廣義工會*直接 – Jarod42