分离配置和算法代码的最佳实践

时间:2015-01-07 07:22:38

标签: c++

我正在编写一些代码来用c ++进行科学计算,我需要对自定义结构foo进行一些计算。为了使将来整个事情更容易维护,我想在单独的文件中分隔设置foo.bar=1;等结构的代码。怎么实现呢?该结构使用犰狳库来支持矩阵/线性代数。我已经编写了头文件f.hpp,如:

#include <armadillo>
#include <complex>
using namespace arma;

#ifndef __fn__
#define __fn__

struct foo
{
    cx_mat a;
    mat b;
    cx_cube c;
    complex<double> d;
    string desc;
};

#endif

2 个答案:

答案 0 :(得分:2)

将其添加到源代码文件将要求您每次希望更改值时进行编译。这是一种不好的做法,特别是如果你的编译时间很长。

推荐的方法是让配置文件说'foo.ini'。如果您使用第三方/开源库,例如https://code.google.com/p/inih/http://www.hyperrealm.com/libconfig/,则可以拥有灵活的配置文件。

但是,如果你想保持简单,试试这个约定: 具有备用键值对的配置文件,具有固定的预期顺序。例如:

# foo.bar
42
# foo.pub
You're awesome
# foo.club
24/06/2015
# tab.a
64

请注意,值的顺序很重要,这将使我们可以使用简单的C ++代码轻松解析。只需打开文件并重复调用getLine(),忽略所有其他行并解析第二行以将其存储到结构中。

如果你想存储一个复杂的结构 - 例如矩阵,你可以设置一个简单的策略来存储这样的结构,因为解析函数也是由我们编写的:

# Foo matrix rows
100
# Foo matrix cols
50
# Foo matrix elements, row-by-row:
0.5 3 5 23 ... ... 100
4 5 5 34 1 ... ... 100
.
.
3 33 33 2 ...  ... 100

# Diagonal Matrix rows-cols
20
# Diagonal Values, row-by-row others 0
45
22
92
.
.
20

另请注意,libconfig(http://www.hyperrealm.com/libconfig/)允许您使用数组和类似Json的文本来存储和表示此类复杂的数据结构。如果你想要一个完整的“配置语言”,你可以使用它。

你节省了大量的编译时间。只需更新配置文件并重新运行程序即可。这样,其他程序可以输入配置值。

答案 1 :(得分:2)

另一种可能性,在识别HPC中非常常见,它可以在您的应用程序中嵌入一些脚本语言。

您可以在应用程序中嵌入LuaGuile(或Ocaml)解释器,并在运行复杂计算之前让它解释一些初始化脚本。该用户提供的脚本可以执行一些简单的解释计算来初始化您的数据。您只需提供一些脚本原语来操作(和创建)用户将与其脚本组合的数据。

您还可以使您的应用程序成为某些现有框架的扩展(或插件),例如ScilabOctaveRPythonNekoVM < / p> 顺便说一下,您的程序还可以读取一些简单数据(可能使用文本serialization格式,如Json),您的用户自己会编写其他一些脚本或程序来提供您的(例如使用{{3 }})。

另一种方法可能是用C ++初始化你的东西,它可能是生成的(甚至可能是你的程序来自某些更高级别的输入),并在运行时编译该C ++代码然后Unix pipelines作为插件使用dynamically load(我正在dlopen(3)执行此类操作...)。

请注意,嵌入或集成某些解释器是主要的软件架构设计选择,您应该尽早做出选择。