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是一个抽象基类,它禁用复制构造函数等
我想知道这是否适合这种模式。如果没有,还有什么可能起作用呢?对于大多数意图和目的,单例是一个带有糖衣的全局变量。全局变量有时当然有用,但它们也可能是问题的原因(因为不可能有多个疯狂)
我个人会考虑拥有一个包含这些值(也许不可复制)的类,但是使它成为实际计算的(参考)成员,并且更明确地表明它正在被使用。如果您需要两个(或更多)这样的对象,这也允许您使用多个对象,而不必重写代码来处理这种情况。您几乎不需要一个单独的对象。问题是,计算的多个实例可能需要同一个矩阵。或者有什么办法吗?然后把同一个物体放进去。我的观点是,一个单独的对象永远只能是一个——没有什么可以阻止你总是使用一个对象,即使它作为引用存储在十几个地方。当我在编译器中创建
解析器
对象时,我遇到了一个类似的问题——我认为我只需要一个,但我需要实现“模块”,这需要一个“新的”解析器
。因此,有时候,能够创建第二、第三、第四个实例是有帮助的,并且存储对实例的引用通常比调用返回静态实例的函数花费更少。