0

我有一个“处理器”类,它需要一些东西:1)访问允许访问数据库的类的实例。2) 访问字符串实用程序类。3) 在运行时从配置文件中读取的超时整数值。

因此,我想将指向前两个的指针作为成员属性,并将一个简单的 int 属性作为第三个。通常,在这种情况下,我只需让构造函数为前两个获取指针,为第三个获取一个 int,然后在正文中,将成员分配给传入的项目。

问题是我将拥有一个包含这个处理器类的 100 个实例的池,我想知道让每个实例包含它自己的 (2) 指针和整数属性是否浪费内存,当所有指针将指向相同的两个对象,并且所有整数将在整个过程的生命周期中保持相同的值。

我熟悉“全局状态不好”的概念,并认为它不鼓励使用静态成员属性。但是在这种情况下,简单地将这三个属性设置为静态不是更有效吗?然后我将创建一个静态“initStaticMembers”方法,该方法接受两个指针和整数,并将静态成员属性分配给传入的项目。initStaticMembers 将在创建处理器实例池之前被调用一次。

我不是最后一部分(静态 initStaticMembers 方法)的超级粉丝......只是看起来不是很优雅,但我看不出明显更好的选择。有人有建议吗?我是否正确地认为使用静态属性可以节省内存而不是为每个处理器类实例提供它自己的一组属性实例?

我还应该注意,所指向的类是线程安全的,所以我认为我不需要关心所有处理器共享一个指向每个处理器的指针。

感谢您的任何反馈。

4

2 回答 2

1

鉴于您所描述的情况,使用static成员确实会节省一些内存(在这种情况下非常少。)

如果你能保证两个条件,那么我会说在这里使用静力学是安全的。这两个条件是:

  1. initStaticMembers总是在使用任何这些静态成员数据之前被调用;
  2. 所有Processor实例的生命周期在数据库访问类和字符串实用程序类的生命周期之后开始,并在它们之前结束。

如果您可以保证这些(例如,在管理Processors 池的代码中),那么您就可以了。作为一种良好的编码实践,请确保在所有处理器完成initStaticMembers再次调用,并且值为零。nullptr

避免static数据通常是一种非常好的做法。但这主要是因为您无法轻松控制静态对象的生命周期(和初始化顺序)。但是,看起来您的静态指针成员实际上并不拥有任何东西,也不控制任何对象的生命周期,这在这里是一件好事。

所以简而言之,如果你小心的话,在这种情况下使用静态成员数据应该没问题。但是,我需要再次强调,您在这里并没有节省太多内存。

如果您的静态数据较大(大于几个指针和一个int,),我建议使用非静态shared_ptrs 而不是原始指针来指向它们。但是,在您的情况下,shared_ptr数据结构将大于您的整个共享数据。

于 2013-06-24T22:55:21.203 回答
0

如果数据库类真的是一个应用程序全局的东西,那么让它成为全局的。有些事情只是全球性的,而战斗将导致代码难以阅读。

当您的应用程序是自包含的,并且您正在编写的类特定于该应用程序时,通常可以使用单例模式来创建应用程序类。

Application::GetInstance().GetDatabase();

你有静态方法的地方:

Application& Application::GetInstance()
{
    static Application app;
    return app;
}
于 2013-06-24T22:55:10.797 回答