可变长度的物体:永远是个好主意?

Ton*_*ony 8 c++ design-patterns class-design data-structures

我的应用程序使用大量Panda对象.每个Panda都有一个Bamboo对象列表.Panda初始化后,此列表不会更改(不Bamboo添加或删除任何对象).目前,我的课程实现如下:

class Panda
{
    int a;
    int b;
    int _bambooCount;
    Bamboo* _bamboo;

    Panda (int count, Bamboo* bamboo)
    {
        _bambooCount = count;
        _bamboo = new Bamboo[count];

        // ... copy bamboo into the array ...
    }
}
Run Code Online (Sandbox Code Playgroud)

为了减轻分配Bamboo对象数组的开销,我可以按如下方式实现这个类 - 基本上,不是通过常规构造函数创建对象,而是构造方法分配一个内存块来保存Panda对象及其Bamboo数组:

class Panda
{
    int a;
    int b;

    Panda ()
    {
        // ... other initializations here ...
    }

    static Panda *createPanda (int count, Bamboo* bamboo)
    {
        byte* p = new byte[sizeof(Panda) +
                           sizeof(Bamboo) * count];
        new (p) Panda ();

        Bamboo* bamboo = (Bamboo*)
            p + sizeof(Panda);

        // ... copy bamboo objects into the memory
        // behind the object...

        return (Panda*)p; 
    }
}
Run Code Online (Sandbox Code Playgroud)

除了增加维护工作之外,你能预见第二种设计有什么问题吗?这是一种可接受的设计模式,还是仅仅是一种过早的优化,可能会在以后再次让我感到困惑?

Kir*_*sky 11

C++为您提供了另一种选择.你应该考虑使用std :: vector.

class Panda
{
    int a;
    int b;
    std::vector<Bamboo> bamboo;
    // if you do not want to store by value:
    //std::vector< shared_ptr<Bamboo> > bamboo;

    Panda (int count, Bamboo* bamb) : bamboo( bamb, bamb+count ) {}
}
Run Code Online (Sandbox Code Playgroud)

如果您想将Panda和Bamboos存储在连续内存中,您可以使用本文中的解决方案.主要想法是超载operator newoperator delete.


Dav*_*eas 7

我们如何说服人们在编程中简单明了 - 简而言之:数学家称之为'优雅' - 不是一种可有可无的奢侈品,而是决定成败的关键因素吗?

- Edsger W. Dijkstra


Chr*_*isW 5

如果有人按价值获得熊猫,你会被咬伤的

//compiler allocates 16-bytes on the stack for this local variable
Panda panda = *createPanda(15, bamboo);
Run Code Online (Sandbox Code Playgroud)

如果您只是通过指针引用事物而从不通过值引用事物,并且如果您要注意复制构造函数和赋值运算符,那么它可能是可接受的(但很可能是过早且可怕的优化).