2012-11-25 75 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它会浪费一些记忆,但我想不出任何其他方式。 –