2012-11-25 108 views
0

我想將由各種類型的多個POD結構體組成的狀態變量存儲到單個存儲區中。由於用於組成狀態變量的結構組合是在運行時決定的,因此我不能將它們放在周圍的結構或類中。另外我希望內存分配的數量儘可能低。 做什麼是最好的方法?下面的代碼是合法/可移植的,還是可以在某些平臺/某些編譯器上導致對齊錯誤?在C++中連續存儲區中存儲多個結構體

struct TestA { 
    int a; 
    short b; 
}; 

struct TestB { 
    int c; 
    float d; 
    char e; 
}; 

int main() { 
    void* mem = new uint8_t[sizeof(TestA) + sizeof(TestB)]; 
    TestA* a1 = (TestA*) mem; 
    a1->a = a1->b = 42; 
    a1++; 
    TestB* b = (TestB*) a1; 
    b->c = 5; 
    b->d = 23.f; 
    b->e = 'e'; 
} 
+0

這聽起來有點像我在C做的黑客攻擊。如果你用C++編寫,爲什麼不使用多態?一個基類和多個派生類,和/或一個創建模式在運行時構造這些類將爲可移植性和可維護性帶來很大的幫助。 – rutgersmike

+0

您提出了一個有效的觀點,我已經考慮過這樣的設計。然而,我認爲許多內存分配和間接指向可能會成爲一個性能問題,因爲對於我的特定應用程序,我希望存儲冗餘可組合的聲音合成組件的狀態,顯然必須每秒運行44100次 – Askaga

回答

3

你想要做的事實質上是「放置新的」。所以所有的注意事項也適用於此。如果內存位置沒有針對給定類型正確對齊,那麼您將陷入未定義的行爲。在您的代碼中:

a1++; 

不保證給出正確對齊TestB的地址。所以你的代碼不符合標準。

+0

因此,我猜測唯一的標準符合的方式來做我所要求的是將所有可能的結構放在一個聯合中,並分配這個聯合的數組。 – Askaga

+0

@BillAskaga它會浪費一些記憶,但我想不出任何其他方式。 –