我是一名研究科学代码的物理学家。如果这是一个常规问题,请道歉:它之前可能已经得到了解答,但我没有足够的软件工程背景知识。
基本上,代码需要执行大量的矩阵乘法 由少数不同的矩阵组成。首先构建矩阵是非常昂贵的,所以我希望它们在使用之间保持不变。但是,执行乘法的类无法知道矩阵在初始化期间将会是什么。它们在其生命周期内会有很大差异,并且乘法类的多个实例通常会使用相同的矩阵。
在我看来,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(),.....);
}
NonCopyable是一个禁用复制构造函数等的抽象基类。
我想知道这是否适合这种模式。如果没有,还有什么可行的?
答案 0 :(得分:2)
对于大多数意图和目的而言,单身人士是糖衣的全球变量。全局变量有时是有用的,但它们也可能是问题的原因(因为没有办法有多个insance)。
我个人会考虑拥有一个包含这些值的类(可能是不可复制的),但要使它成为实际计算的(引用)成员,并且更明确地表明它正在被使用。如果你需要有两个(或更多)这些对象,这也允许你使用多个,而不是必须重写代码来处理这种情况。