C++ 我需要单身吗?

C++ 我需要单身吗?,c++,singleton,C++,Singleton,我是一名物理学家,正在研究一个科学代码。如果这是一个常规问题,我深表歉意:很可能以前已经回答过了,但我没有足够的软件工程背景 基本上,代码需要执行大量矩阵乘法 通过少量不同的矩阵。首先构造矩阵非常昂贵,所以我希望它们在不同的使用之间保持不变。然而,进行乘法运算的类无法知道在初始化过程中矩阵是什么。它们在其生命周期内会有很大的变化,相同的矩阵通常会被乘法类的多个实例使用 在我看来,单例模式适用于这种情况:我们可以创建一个矩阵池,由它们之间的区别来设置键。然后,乘法类可以在需要矩阵时访问该池 以下是

我是一名物理学家,正在研究一个科学代码。如果这是一个常规问题,我深表歉意:很可能以前已经回答过了,但我没有足够的软件工程背景

基本上,代码需要执行大量矩阵乘法 通过少量不同的矩阵。首先构造矩阵非常昂贵,所以我希望它们在不同的使用之间保持不变。然而,进行乘法运算的类无法知道在初始化过程中矩阵是什么。它们在其生命周期内会有很大的变化,相同的矩阵通常会被乘法类的多个实例使用

在我看来,单例模式适用于这种情况:我们可以创建一个矩阵池,由它们之间的区别来设置键。然后,乘法类可以在需要矩阵时访问该池

以下是我的想法:

//SingletonDictionary.hpp
class SingletonDictionary : private NonCopyable {
    public:
        void Clear(); //Calls member variable destructors.
        ~SingletonDictionary() { Clear(); }
    private:
        friend SingletonDictionary& TheSingletonDictionary();
        SingletonDictionary() {}; //Only the friend can make an instance.

        //Retrieve searches through the key vectors for a match to its
        //input. In none is found, the input is added to the key vectors,
        //and a new Value is constructed and added to the ValueVector.
        //In either case the ValueVector is returned.
        std::vector<double>& Retrieve(const int key1, const int key2);

        std::vector<int> mKey1;
        std::vector<int> mKey2;
        std::vector<double> mValue;
}

//SingletonDictionary.cpp
SingletonDictionary& TheSingletonDictionary() {
    static SingletonDictionary TheSingleton;
    return TheSingleton;
}

//DoMatrixMultiply.cpp
void ApplyTransformation(std::vector<double> data){
     const int key1 = data.size()[0];
     const int key2 = data.size()[1];
     SingletonDictionary TheSingletonDictionary();
     std::vector<double> TransformMatrix = 
                      TheSingletonDictionary.Retrieve(key1, key2);
     DGEMM("N", "N", data.Data(), TransformMatrix.Data(),.....);
}
//SingletonDictionary.hpp
类SingletonDictionary:私有不可复制{
公众:
void Clear();//调用成员变量析构函数。
~SingletonDictionary(){Clear();}
私人:
friend SingletonDictionary&TheSingletonDictionary();
SingletonDictionary(){};//只有朋友才能创建实例。
//检索在关键向量中搜索与其匹配的项
//输入。如果未找到,则将输入添加到关键向量,
//然后构造一个新值并将其添加到ValueVector。
//无论哪种情况,都会返回ValueVector。
std::向量和检索(const int key1,const int key2);
std::载体mKey1;
std::载体mKey2;
std::向量值;
}
//SingletonDictionary.cpp
单音词典{
静态单音词典;
返回辛格尔顿;
}
//DoMatrixMultiply.cpp
无效应用程序转换(标准::矢量数据){
const int key1=data.size()[0];
const int key2=data.size()[1];
单音词典单音词典();
标准::向量转换矩阵=
singletondictionary.Retrieve(键1、键2);
DGEMM(“N”,“N”,data.data(),TransformMatrix.data(),…);
}
NonCopyable是一个抽象基类,它禁用复制构造函数等


我想知道这是否适合这种模式。如果没有,还有什么可能起作用呢?

对于大多数意图和目的,单例是一个带有糖衣的全局变量。全局变量有时当然有用,但它们也可能是问题的原因(因为不可能有多个疯狂)


我个人会考虑拥有一个包含这些值(也许不可复制)的类,但是使它成为实际计算的(参考)成员,并且更明确地表明它正在被使用。如果您需要两个(或更多)这样的对象,这也允许您使用多个对象,而不必重写代码来处理这种情况。

您几乎不需要一个单独的对象。问题是,计算的多个实例可能需要同一个矩阵。或者有什么办法吗?然后把同一个物体放进去。我的观点是,一个单独的对象永远只能是一个——没有什么可以阻止你总是使用一个对象,即使它作为引用存储在十几个地方。当我在编译器中创建
解析器
对象时,我遇到了一个类似的问题——我认为我只需要一个,但我需要实现“模块”,这需要一个“新的”
解析器
。因此,有时候,能够创建第二、第三、第四个实例是有帮助的,并且存储对实例的引用通常比调用返回静态实例的函数花费更少。