C++如何用应用程序存储大型二进制查找表



我怀疑我想做的是创建一个二进制库或.obj之类的东西,我可以直接为链接器提供信息,但我甚至不确定是TFM还是R。

我有一个大的二进制LUT(200万个32位值。(它需要长的时间来计算,我真的希望避免每次运行应用程序时重新计算它。我也不想把它作为一个单独的文件存储并读入,这就是我现在正在做的。

对于较小的LUT,我通常只会做一个带有适当入口声明的头文件,但在这种情况下,这似乎是不可行的,并且仅生成头文件就会产生大量开销。

开发目标和环境是由Visual Studio 2019社区版创建的CMAKE应用程序。

如果您使用C++14或更高版本,您可能可以在编译时使用constexpr来制作LUT。

这也许是你想要的?https://stackoverflow.com/a/37413361/12743421

我用以下方式完成了类似的任务:

  1. 在头文件say it MySpecialArray.h中,只有外部数组声明:
enum {
uMySpecialArraySize = 1000000,
};
extern const unsigned* g_pMySpecialArray;
  1. 生成(通过可定义块或外部项目的特殊运行(一个文件MySpecialArray.cpp,其中实际LUT数据为静态C数组:
#include "stdafx.h"
#include "MySpecialArray.h"
const unsigned g_MySpecialArray[uMySpecialArraySize] = {
0x12345678, 0x12345678, 0x12345678, 0x12345678, 0x12345678, 0x12345678, 
...
};
const unsigned* g_pMySpecialArray = g_MySpecialArray;

这对我起了很多年的作用。数组很容易从代码中访问,数据块在编译的exe中。中型项目的编译时间是正常的,据我记忆所及,这次添加并没有重大变化。

我的LUT比要求的数百万小几倍,但希望它也能在数百万上工作。这个问题有点老,但也许其他人会寻求解决方案。

最新更新