存储大量的编译时间常数数据

时间:2020-05-07 22:33:10

标签: c++

我希望以前都没有问过这个问题,但是经过一个小时的搜寻后,我找不到任何答案。

我有以下问题:我做数值数学,并且我有大约40 MB的doubles形式的某些矩阵是编译时间常数。我在程序中经常使用这些矩阵。这些矩阵的创建需要一周的计算,因此我不想即时计算它们,而是使用预先计算的值。

以便携式方式执行此操作的最佳方法是什么?现在,我有一些非常大的CPP文件,在这些文件中,我创建了以常量作为初始化列表的动态分配矩阵。大致情况:

data.cpp:

namespace // Anonymous
{

// math::matrix uses dynamic memory internally
const math::matrix K { 3.1337e2, 3.1415926e00, /* a couple of hundred-thousand numbers */ };

}

const math::matrix& get_K() { return K; }

data.h

const math::matrix& get_K();

由于初始化程序列表,我不确定这是否会导致堆栈上的数据过多的问题。或者,如果这会使某些编译器崩溃。或者,如果这是解决问题的正确方法。不过它似乎确实可以正常工作。

我还考虑过在程序启动时从外部文件加载矩阵,但这对我来说似乎很麻烦。

非常感谢您!

2 个答案:

答案 0 :(得分:2)

由于初始化程序列表,我不确定这是否会导致堆栈上的数据过多的问题。

假定它具有带有非动态初始化的静态存储应该没有问题。如果math::matrix是聚合,则应该是这种情况。

鉴于这些值将是编译时常数,您可以考虑在标头中定义它们,以便所有转换单元都可以在编译时利用它们。究竟有多有益,取决于如何使用这些值。

我还考虑过在程序启动时从外部文件加载矩阵

此方法的好处是您获得了更大的灵活性,因为在更改数据时无需重新编译程序。如果程序的编译成本很高,则此功能特别有用。

答案 1 :(得分:0)

一种更简洁的方法:

// math::matrix uses dynamic memory internally
const math::matrix K { 
   #include "matrix_initial_values.h"
};

并且,在包含的标题中,

3.1337e2, 3.1415926e00, 1,2,3,4,5e6, 7.0,...

考虑您对“数十万个”浮点值的评论:1M double值占用8,000,000字节,约7.6MB。那不会炸毁堆栈。 Win64的最大堆栈大小为1GB,因此您必须非常小心,并且假设这些值实际上位于堆栈中,鉴于这些值,它们不应 {1}}。

这可能是特定于实现的,但是通常将一大堆文字存储为一大块代码空间数据,这些代码空间数据直接加载到进程的内存空间中。标识符(const)实际上只是该数据的标签。它不像代码那样存在于堆栈或堆中。

相关问题