我目前正在为遗传编程系统重构一些c ++。在当前代码中,我有一个全局可用的随机数生成器对象。它的设置就像这样
RNG.h
RNG.cpp -> Instance created here
Globals.h -> includes 'RNG.h'
-> extern RNG rng;
OtherClasses -> include 'Globals.h'
RNG实例设置生成器向量,每个可用线程一个。我花了很多时间做这件事。这种全局设置很方便,但每个翻译单元的实例可能会更快吗?围绕这种要求是否有最佳实践?
它经常被认为可能会删除全局变量,但它似乎很适合。
答案 0 :(得分:1)
我的意思是将RNG创建为使用它的类中的成员
这可能会降低性能,因为每次创建包含它的类的对象时都会实例化和初始化RNG对象(与程序启动时的单个初始化相反)。
然而,您可以共享您的对象,例如使用std::shared_ptr
或原始指针。您只需将构造函数中的它们传递给对象即可。如果没有提供RNG,您可以创建一个(重载构造函数)。特别是考虑到RNG经常被播种,这可能是最好的解决方案。
此外,您可以在RNG类中实现静态GetDefault()
方法(类似于单例模式,但不限制每个进程一个对象)。
两者结合起来可能导致这样的实现:
class RNGUser
{
std::shared_ptr<RNG> m_rng;
RNGUser()
: m_rng(RNG::GetDefault())
{
}
RNGUser(std::shared_ptr<RNG> rng)
: m_rng(rng)
{
}
};