簡體   English   中英

是否可以在編譯時初始化數組,以便在運行時不需要時間?

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

例如,如果我想創建多達 200 萬個 Eratosthenes 篩,在運行時將需要一些時間。 有沒有辦法通過使用元編程來減少運行時間?

Sieve 的代碼(將 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

So just configure your build automation tool (eg GNU make or ninja ) to generate at build time (perhaps with a Python or Guile script, or your C++ metaprogram) some C++ file, or some file that would be #include -d elsewhere. 或者寫你的GCC 插件這樣做。

BTW, this idea is not new: ANTLR and GNU bison or Qt or SWIG do so (and recent GCC compilers -eg GCC 10 - have a dozen of specialized C++ code generators). 而我放棄的項目GCC MELT就是這樣做的。 RefPerSysbismon 也是如此(對於哈希表中有用的素數,這兩個都是我開始的項目)。 primes_rps.cc文件的部分內容是機器生成的(請參閱其中的注釋)。

某些情況下,一個聰明的優化編譯器可以優化constexpr的東西。 請注意賴斯定理,它指出並不總是可以巧妙地優化。 另見本報告草稿

您還可能對代碼生成庫感興趣,例如asmjitlibgccjit ,或在運行時生成插件(在 Linux 上,您將使用dlopen(3)dlsym(3) ,但首先閱讀C++ dlopen mini- how編寫共享庫)。

PS。 對於其他操作系統(例如 Windows)和 C++ 編譯器,情況可能會有所不同,但上述大多數想法都是可重用的。 閱讀 C++編譯器操作系統的文檔。 交叉編譯方法中,您可能需要更多技巧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM