【问题标题】:Is it possible to initialize an array at compile-time so it doesn't take time at run-time?是否可以在编译时初始化数组,以便在运行时不需要时间?
【发布时间】:2020-11-02 12:51:11
【问题描述】:

例如,如果我想创建多达 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;
}

【问题讨论】:

  • constexpr 用于initCiur 函数?

标签: c++ runtime metaprogramming compile-time


【解决方案1】:

有没有办法通过使用元编程来减少运行时间?

当然可以。我对“metaprogramming”的理解非常广泛,就像任何生成代码的程序(不仅仅是聪明的 C++ 模板)一样。

在大多数C++ implementations 上(例如,如果在某些GNU/Linux 操作系统上使用一些最新的GCC 编译器),C++ translation unit 实际上是textual file。另请阅读 C++11 标准 n3337

所以只需在构建时配置您的build automation 工具(例如GNU makeninja)以生成(可能使用PythonGuile 脚本,或者您的C++ 元程序) 一些 C++ 文件,或者一些在其他地方是 #include-d 的文件。或者写你的GCC plugin这样做。

顺便说一句,这个想法并不新鲜:ANTLRGNU bisonQtSWIG 这样做(最近的 GCC 编译器 - 例如 GCC 10 - 有十几个专门的 C++ 代码生成器)。而我废弃的项目GCC MELT 也这样做了。 RefPerSysbismon 也是如此(对于哈希表中有用的素数,这两个都是我开始的项目)。 primes_rps.cc file 的部分内容是机器生成的(参见其中的 cmets)。

某些情况下,聪明的optimizing compiler 可以优化constexpr 的东西。请注意Rice's theorem,它指出并非总是可以巧妙地优化。另请参阅this draft 报告。

您也可能对代码生成库感兴趣,例如 asmjitlibgccjit,或在运行时生成 plugins(在 Linux 上,您将使用 dlopen(3)dlsym(3),但请先阅读 @ 987654352@ 然后how to write shared libraries)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多