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 new和operator delete.
如果有人按价值获得熊猫,你会被咬伤的
//compiler allocates 16-bytes on the stack for this local variable
Panda panda = *createPanda(15, bamboo);
Run Code Online (Sandbox Code Playgroud)
如果您只是通过指针引用事物而从不通过值引用事物,并且如果您要注意复制构造函数和赋值运算符,那么它可能是可接受的(但很可能是过早且可怕的优化).
| 归档时间: |
|
| 查看次数: |
2024 次 |
| 最近记录: |