关于C++的设计和效率的问题...想象一下这样的代码 -高效创建大量小C++对象的需要访问“全局”对象
Database db;
class SmallObject
{
private:
/* Some small amount of data and functions */
public:
/* Constructor, more functions */
void fn1() { /* Code that uses global db to do it's job */ }
void fn2() { /* Code that uses global db to do it's job */ }
void fn3() { /* Code that uses global db to do it's job */ }
void fn4() { /* Code that uses global db to do it's job */ }
};
这很好,高效,效果很好。但是数据库是全局状态,这是不好的。它使得非常难以独立地测试类,并且意味着SmallObject依赖于数据库的特定实现。
所以我重组它是这样的: -
class SmallObject
{
private:
/* Some small amount of data and functions */
public:
SmallObject(Database& db) { db_ = db; }
void fn1() { /* Code that uses global db_ to do it's job */ }
void fn2() { /* Code that uses global db_ to do it's job */ }
void fn3() { /* Code that uses global db_ to do it's job */ }
void fn4() { /* Code that uses global db_ to do it's job */ }
};
也许会让一个工厂来创建他们,所以我可以粗略像以前一样使用它们。
class SmallObjectFactory
{
private:
Database* db_;
public:
SmallObjectFactory()
{
db_ = new SpecificDatabaseSubclass;
}
SmallObject* create() { return new SmallObject(db_); }
};
这也意味着我的SmallObject不再与确切的数据库实现耦合,但仍然方便使用。
但是,假设有10000个SmallObject实例。现在每个人都有一个指向的数据库对象在那里。这是可怕的低效率,也不觉得重复数据这么多次是好设计...
那么,是否有一些模式在C + +,允许我不使数据库全局,但让我不要在每个SmallObject实例中存储重复数据?
这是专门C++模板等等等等,都很好...
什么让你觉得有很多指针的一个对象是无效的?唯一重复的是数据库对象的内存地址,这个地址很小。 – SirDarius 2011-02-07 15:13:39
我同意SirDarius,你只会使用4-8字节/指针(取决于你的架构)。所以你只需要为10,000个对象使用40-80k的额外字节。也许如果你创造了数百万的这些物体,这将是一个问题。 – GWW 2011-02-07 15:16:08
也许这是一个不好的例子。这不是绝对的内存量,但它可能会使我的对象使用量增加一倍。更有甚者,似乎无用地在我的对象的每一个实例中存储相同的值,并且想知道是否有任何合理的方法来避免那些没有发生在我身上的东西。 – jcoder 2011-02-07 15:17:17