2

我有以下问题:我需要在 Visual C++ 中开发一个静态库 (*.lib) 以进行高效的数值计算。我已经开始定义一个新的模板类“矩阵”,并且我已经读到使用表达式模板可以实现最佳效率。但我也读过(并且经历过)我不能将表达式模板包含在静态库中,因为您需要显式地实例化所有组合。

所以 - 例如 - 如果我想在一个新项目中做:

Matrix<int> M_A, M_B, M_C, M_D;

M_C = M_A + M_B + 2 * M_D;
M_C = 2 * M_B;
M_C = M_A + 2 * M_B;

导入我的 *.lib 文件,我必须在我的静态库中创建 3 种不同的组合以允许等式 M_C = Expression。

有没有一种方法或“最佳实践”来简化静态库中的显式实例化?或者,有没有表达模板的替代方案,可以在没有导出问题的情况下实现相同的效率?为了澄清起见,我需要保留紧凑符号的可能性,例如: M_C = M_A + M_B + 2 * M_D;

谢谢你。

附言。我添加了更多细节以更好地解释:

如果我创建我的静态库,我可以在外部项目中使用它,但我必须导出所有模板专业化。模板类 __declspec(dllexport) 矩阵;模板类 __declspec(dllexport) 矩阵;

等等...

问题是我必须对所有可能的表达式做同样的事情以允许等式(例如,M_A = M_B + M_C)。我必须导出类似这样的内容:模板类 LibraryNameSpace::Matrix const & __thiscall LibraryNameSpace::Matrix::operator=,int>(class LibraryNameSpace::myExpression,int>);

如果不将所有代码包含在 lib 文件中,对我来说没有问题:我可以毫无问题地使用我的库。该问题与在静态库中包含表达式模板有关。我需要这样做来屏蔽代码并且不让最终用户能够阅读它。

4

2 回答 2

0

除非出于教育目的,否则您可能不应该从头开始开发自己的东西。

看看闪电战++。根据其手册,它编译为静态库。

于 2013-05-06T11:42:26.010 回答
0

在开发自己的 ET 线性代数库之前,您是否考虑过使用现有的?

您可以选择(不分先后):EigenBlazeuBlasblitz++

它们都是使用表达式模板来摆脱混合矩阵/向量运算的临时库,其中一些(Blaze 和 Eigen)更进一步,专门针对特定矩阵/向量运算(智能表达式模板)的模板。所有提到的库都是由一群人(一些科学)开发的,并且已经过调试和测试,并记录在开放的科学出版物中,并使用 Wiki 等。

由于主题的复杂性,我建议考虑重新发明轮子是否适合这里。如果您想要高效,最简单的答案是使现有的高效库适应您的需求。

于 2013-05-06T11:44:54.043 回答