[英]Initialize global array of function pointers at either compile-time, or run-time before main()
[英]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++ 實現上(例如,如果在某些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就是這樣做的。 RefPerSys和bismon 也是如此(對於哈希表中有用的素數,這兩個都是我開始的項目)。 primes_rps.cc
文件的部分內容是機器生成的(請參閱其中的注釋)。
在某些情況下,一個聰明的優化編譯器可以優化constexpr
的東西。 請注意賴斯定理,它指出並不總是可以巧妙地優化。 另見本報告草稿。
您還可能對代碼生成庫感興趣,例如asmjit或libgccjit ,或在運行時生成插件(在 Linux 上,您將使用dlopen(3)和dlsym(3) ,但首先閱讀C++ dlopen mini- how編寫共享庫)。
PS。 對於其他操作系統(例如 Windows)和 C++ 編譯器,情況可能會有所不同,但上述大多數想法都是可重用的。 閱讀 C++編譯器和操作系統的文檔。 在交叉編譯方法中,您可能需要更多技巧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.