全局对象是否提供比几个本地实例更好的性能?

时间:2014-02-18 22:24:04

标签: c++ oop optimization global

我目前正在为遗传编程系统重构一些c ++。在当前代码中,我有一个全局可用的随机数生成器对象。它的设置就像这样

RNG.h
RNG.cpp   -> Instance created here

Globals.h -> includes 'RNG.h'
          -> extern RNG rng;

OtherClasses -> include 'Globals.h'

RNG实例设置生成器向量,每个可用线程一个。我花了很多时间做这件事。这种全局设置很方便,但每个翻译单元的实例可能会更快吗?围绕这种要求是否有最佳实践?

它经常被认为可能会删除全局变量,但它似乎很适合。

1 个答案:

答案 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)
    {
    }

};