C++ 将结果存储在单独的库中,以便以后加载

C++ 将结果存储在单独的库中,以便以后加载,c++,C++,如果我有一些可以在编译时计算的结果集,并且我想在程序中的其他地方使用它们,我可以将它们放在(共享的?)库中以便以后链接吗?这会慢一点吗 例如,我可以在编译时使用 template<size_t N> struct Factorial { constexpr static size_t value = Factorial<N-1>::value * N; }; template<> struct Factorial<0> { con

如果我有一些可以在编译时计算的结果集,并且我想在程序中的其他地方使用它们,我可以将它们放在(共享的?)库中以便以后链接吗?这会慢一点吗

例如,我可以在编译时使用

template<size_t N>
struct Factorial {
    constexpr static size_t value = Factorial<N-1>::value * N;
};

template<>
struct Factorial<0> {
    constexpr static size_t value = 1;
};

// Possibly an instantiation for a max value?
// template class Factorial<50>;
模板
结构阶乘{
constexpr static size\u t value=Factorial::value*N;
};
模板
结构阶乘{
constexpr静态大小\u t值=1;
};
//可能是最大值的实例化?
//模板类阶乘;
然后,为了在代码中使用它,我只编写了
Factorial::value
,或者类似的代码

如果我假设我的实际值需要更长的时间来计算,那么我可能希望确保不会在每个构建/任何认为旧构建无效的构建上重新计算它们

因此,我将计算代码移动到一个单独的项目中,并将其编译为一个共享库

现在,为了使用它,我将我的主程序链接到库,并将标题包含在内

但是,库文件非常小(似乎与创建模板所传递的值无关),因此我想知道库是否实际上只包含创建
阶乘结构的方法,而不是预计算的数据

如何计算一系列值,然后在单独的程序中使用它们


首选提供编译时值注入的解决方案-我注意到加载共享库不属于这一类(我认为)

您可以在构建过程中计算变量(通过一个单独的应用程序,作为构建过程的一部分进行编译和调用)并将结果存储在生成的源文件中。 例如,使用CMake(
configure_file
)Makefiles或NMake应该非常简单

您可以按照建议使用生成的源文件生成共享库,也可以直接将生成的源链接/包含到应用程序中

这种方法的一个优点是不再局限于编译时计算,
您还可以使用运行时计算,这将更快,因为它可以被优化。

这里发生的是执行计算的实际“代码”仍然在标题中。把它放进一个共享的库并没有真正起到任何作用;编译器仍在重新计算主程序的阶乘。(因此,你的直觉是正确的。)


一个更好的方法是编写另一个程序,将值作为C++常量数组的源代码吐出,然后复制并粘贴到代码中。这大概需要5行Python,C++代码将很快编译和运行。计算任何适合大小的阶乘所需的时间可以在编译时或运行时以微秒为单位进行度量。你过早地优化了一些琐碎的东西。您真正想优化的是什么?有限差分流体力学N宽模板的模板计算-NxN矩阵的矩阵求逆(可能通过LUT),并找到解Ax=B的解向量(Nx1),其中

B=std::array;B.填充(T(0);B[k]=1;
用于
0的一个值