是否可以在编译时初始化数组,以便在运行时不会花费时间?

Is it possible to initialize an array at compile-time so it doesn't take time at run-time?

本文关键字:运行时 费时间 数组 编译 初始化 是否      更新时间:2023-10-16

例如,如果我想创建多达200万个Eratosthenes的筛,那么在运行时需要一些时间。有没有一种方法可以通过使用元编程来减少运行时间?

筛选代码(将std::bitset初始化为const MILLION(:

void initCiur(std::bitset<MILLION> &c)
{
c[0] = c[1] = 1;
for (int i=4; i <= MILLION; i+=2)
c[i] = 1;
for (int i=3; i*i <= MILLION; i+=2)
if (!c[i])
for (int j=3*i; j <= MILLION; j+=2*i)
c[j] = 1;
}

有没有一种方法可以通过使用元编程来减少运行时间?

当然可以。我理解";元编程";与任何生成代码的程序一样(不仅仅是聪明的C++模板(

在大多数C++实现中(例如,如果在某些GNU/Linux操作系统上使用某些最新的GCC编译器(,C++翻译单元实际上是一个文本文件。另请阅读C++11标准n3337。

因此,只需将您的构建自动化工具(例如GNU make或ninja(配置为在构建时生成(可能使用Python或Guile脚本,或您的C++元程序(一些C++文件,或其他地方的#include-d文件。或者写你的GCC插件这样做。

顺便说一句,这个想法并不新鲜:ANTLR和GNU bison或Qt或SWIG都是这样做的(最近的GCC编译器,例如GCC 10,有十几个专门的C++代码生成器(。我放弃的GCC MELT项目就是这么做的。RefPerSys和bismon也是如此(对于哈希表中有用的素数,这两个项目都是我开始的(。primes_rps.cc文件的部分内容已由机器生成(请参阅其中的注释(。

某些的情况下,一个聪明的优化编译器可以优化constexpr。请注意Rice定理,该定理指出,巧妙地优化并不总是可能的。另见本报告草稿。

您也可能对代码生成库(如asmjit或libgccjit(感兴趣,或者对在运行时生成插件感兴趣(在Linux上,您将使用dlopen(3(和dlsym(3(,但首先阅读C++dlopen mini howto,然后如何编写共享库(。

PS。对于其他操作系统(如Windows(和C++编译器,情况可能会有所不同,但上面的大多数想法都是可重用的。阅读C++编译器和操作系统的文档。在交叉编译方法中,您可能需要更多技巧。